文字列と正規表現

21912 ワード

文字列とコードポイントシーケンスの相互変換

let str = String.fromCodePoint(0x48, 0x69, 0x20, 0x1F310, 0x21) // 'Hi 🌐!'
let codePoints = [0x48, 0x69, 0x20, 0x1F310, 0x21]
str = String.fromCodePoint(...codePoints)
let characters = [...str]  // ['H', 'i', ' ', '🌐', '!']
codePoints = [...str].map(c => c.codePointAt(0)) // [72, 105, 32, 127760, 33]

部分文字列


indexOf:文字列で見つかった最初の文字列
startsWith、endsWith、include:ブールを返す
substring:2つのオフセットを使用して部分文字列を抽出する
slice:substringと似ていますが、より多くの機能を提供しており、より多くの機能を使用することをお勧めします.
split:文字列を区切り文字で区切る

その他の文字列メソッド


repeat:指定された数で文字列を繰り返す
trim、trimstart、trimeEnd:前後の余白文字を削除する
padStart,padEnd:前後の入力文字を追加する
toUpperCase、toLowerCase:文字列全体を大文字または小文字に変換
concat:文字列に変換
EncodeURICcomponent:utf文字列に符号化し、各バイトを%hhコードに符号化
EncodeURI:url全体をエンコードします.

タグ付きテンプレートバリエーション


タグ関数-テンプレートライブラリから簡単に関数を呼び出します.
HTMLテンプレートの作成、デジタルフォーマットの設定、国際化に使用できます.
const strong = (fragments, ...values) => {
  let result = fragments[0]
  for (let i=0; i< values.length; i++) 
    result += `<strong>${values[i]}</strong>${fragments[i+1]}`
   return result
}

const person = { name: 'hanry', age: 44 }
strong`Next year, ${person.name} will be ${person.age + 1}.`
// 위 구분은 아래처럼 strong 함수를 호출하는 것이다.
strong(['Next year, ', ' will be ', '.'], person.name, person.age)

正規表現


正規表現構文



正規表現の昇り


正規表現のテキストは前後のスラッシュに分かれています
const timeRegex = /^([1-9]|1[0-2]):[0-9]{2} [ap]m$/
正規表現に特別な意味を持つ文字をエスケープする場合は、逆スラッシュを使用します.
const fractionalNumberRegex = /[0-9]+\.[0-9]*/

ひょうしき


韓哲子の専門名称はiignoreCasemmultilisdoAllを説明している.新しい行の代わりにUnicode文字を使用してUnicodeコードユニットをマッチングし、すべてのマッチングstickyが必ずregexを検索します.lastIndexからマッチングを開始する必要があります

正規表現とUnicode


正規表現はUnicodeではなくUTF-16コードユニットを使用します.モードUTF-16コードユニットを検索します.
a = 'Hello 🌐'
a.match(/Hello .$/) // null
a.match(/Hello .$/u) // ['Hello 🌐', index: 0, input: 'Hello 🌐', groups: undefined]
a.match(/Hello \u{1F310}$/u)  // ['Hello 🌐', index: 0, input: 'Hello 🌐', groups: undefined]

RegExpクラスのメソッド

/[0-9]+/.test('agent 007') // true
/[0-9]+/.exec('agent 007 and 009') // ['007', index: 6, input: 'agent 007 and 009', groups: undefined]

let digit = /[0-9]+/g
digit.exec('agent 007 and 009') // ['007', index: 6, input: 'agent 007 and 009', groups: undefined]
digit.exec('agent 007 and 009') // ['009', index: 14, input: 'agent 007 and 009', groups: undefined]
digit.exec('agent 007 and 009') // null
digit.exec('agent 007 and 009') // ['007', index: 6, input: 'agent 007 and 009', groups: undefined]

'agent 007 and 009'.match(/[0-9]+/g) // ['007', '009']

チーム


カッコでグループを指定し、カッコの開き順でグループの数値を決定します.グループ0は、一致する文字列全体を指します.
左かっこの後に?:に加える
/(['"]).*\1/ // "Fred" 와 'Fred'
/(?<quote>['"]).*\k<quote>/ // "Fred" 와 'Fred'

let lineItem = /(?<item>\p{L}+(\s+\p{L}+)*)\s+(?<currency>[A-Z]{3})(?<price>[0-9.]*)/u
let result = lineItem.exec('Blackwell Toaster USD29.95')
let groupMatches = result.groups
 // { item: 'Blackwell Toaster', currency: 'USD', price: '29.95' }

Stringメソッドと正規表現


グローバルタグが設定されていない場合、str.match(regex)の結果はregexになります.exec(str)の結果と同じですが、グローバルタグを設定すると結果配列が返されます.
'agents 007 and 008'.match(/[0-9]+/) // ['007', index: 7, . . .]
'agents 007 and 008'.match(/[0-9]+/g) // ['007', '008']
execでグローバル検索を繰り返さない場合は、matchAllメソッドを使用します.matchAllメソッドはだらだらと結果を返します.
searchメソッドは、最初の一致インデックスまたは結果がない場合に-1を返します.
replaceメソッドは、最初に一致する文字列を提供される文字列に置き換えます.すべて置換するには、グローバルタグを設定します.
'agents 007 and 008'.replace(/[0-9]/g, '?') // 'agents ??? and ???'
splitメソッドは正規表現をパラメータとして受け入れることができる
'aaa , bbb , ccc, ddd'.split(/\s*,\s*/) // ['aaa', 'bbb', 'ccc', 'ddd']

正規表現のreplaceメソッド


置換文字列モード
パターン説明$',$'一致文字列の前または後の部分$&一致文字列$nn第2のグループ$<名前>所与の名前のグループ$$ドル記号
'hello'.replace(/[aeiou]/g, '$&$&$&') // 'heeellooo'
'Harry Smith\nSally Lin'.replace(/^([A-Z][a-z]+) ([A-Z][a-z]+)/gm, "$2, $1") 
// 'Smith, Harry\nLin, Sally'
'Harry Smith\nSally Lin'.replace(/^(?<first>[A-Z][a-z]+) (?<last>[A-Z][a-z]+)$/gm, "$<last>, $<first>")
// 'Smith, Harry\nLin, Sally

// $ 기호뒤의 숫자가 그룹번호보다 크면 그 문자 그대로 사용한다.
'Blackwell Toaster $29.95'.replace('\$29', '$19') // 'Blackwell Toaster $19.95'
文字列ではなく関数を指定することで、より複雑な文字列置換操作を実行できます.関数では、次のパラメータを使用できます.
  • 正規表現に一致する文字列、すべてのグループの一致、一致するオフセット、文字列全体
  •  'Harry Smith\nSally Lin'.replace(/^([A-Z][a-z]+) ([A-Z][a-z]+)/gm, (match, first, last) => `${last}, ${first[0]}.`)
    //'Smith, H.\nLin, S.'

    異能

    '"Hi" and "Bye"'.match(/".*"/g) // ['"Hi" and "Bye"']
    '"Hi" and "Bye"'.match(/"[^"]*"/g) // ['"Hi"', '"Bye"']
    '"Hi" and "Bye"'.match(/".*?"/g) // ['"Hi"', '"Bye"']
    プレビューlookahead p(?=q)p,qは次に登場するときにpを組み合わせ,qは含まない.たとえば、次のコードは、時間の後にコロンが発生したときに時間を探すコードです.
    '10:30 - 12:00'.match(/[0-9]+(?=:)/g) // ['10', '12']
    逆転のプレビュー演算子p(?!q)はpが現れるが,qが従わないときはpを組み合わせる.
    '10:30 - 12:00'.match(/[0-9]{2}(?!:)/g) // ['30', '00']
    振り返ってlookback演算子(?<=p)qはpの前に登場するときにqを組み合わせる.
    '10:30 - 12:00'.match(/(?<=[0-9]+:)[0-9]{2}/g) // ['30', '00']
    逆転後の振り返り演算子(?'10:30 - 12:00'.match(/(?<![0-9:])[0-9]+/g) // ['10', '12']

    練習問題