文字列と正規表現
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']
練習問題
Reference
この問題について(文字列と正規表現), 我々は、より多くの情報をここで見つけました https://velog.io/@ged/문자열과-정규-표현식テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol