正規表現文字の一致

4755 ワード

正規表現はマッチングモードであるか、文字をマッチングするか、位置をマッチングするかを知るべきである.
1、2種類のあいまいな一致
正則的に正確な一致だけではあまり意味がありません.例えば、/hello/、文字列の「hello」というサブ列しか一致しません.
1、クロスブラーマッチング
横方向のぼかしとは、正則的に一致する文字列の長さが固定されていないことを意味し、様々な状況であってもよい.例えば{m,n}を2回用い,最低m回,最大n回マッチングする.
例えば/ab{2,5}c/は、最初の文字が「a」で、次は2~5文字「b」、最後は「c」と一致する文字列を表す.例は次のとおりです.
var reg = /ab{2,5}c/g;
var str = "abc abbc abbbc abbbbc abbbbbc abbbbbbc";
console.log(str.match(reg))
// => ["abbc", "abbbc", "abbbbc", "abbbbbc"]

注意:正規表現を学んだ友人は、正規表現の後ろにあるgがグローバルマッチングの識別子であることを知っています.これは、文字列内の正規表現に合致するすべてのマッチングパターンを見つけ、gは単語globalの頭文字です.
2、縦ボケマッチング
縦方向のぼかしとは、正規一致の文字列であり、特定の文字に対して特定の文字ではなく、複数の可能性があることを意味します.
例えば、/a[123]b/は、「a 1 b」、「a 2 b」、「a 3 b」の3つの文字列に一致することができる.例は次のとおりです.
var reg = /a[123]c/g;
var str = "a0c a1c a2c a3c a4c";
console.log(str.match(reg))
// => ["a1c", "a2c", "a3c"]

二、文字グループ
文字グループといっても、その中の1文字、例えば[abc]は「a」,「b」,「c」のうちの1文字を表す.
1、範囲表示法
文字が多い場合は範囲表現、例えばa-zという26文字の英字のうち任意の文字を一致させるには/[a-z]で表すことができます.「-」という文字列が一致する場合は、/[-a-z]/、例は以下の通りです.
var reg = /[a-z]/g;
var str = "avsf12-df";
console.log(str.match(reg))
// => ["a", "v", "s", "f", "d", "f"]

var reg = /[-a-z]/g;
var str = "avsf12-df";
console.log(str.match(reg))
// => ["a", "v", "s", "f", "-", "d", "f"]

2、文字グループの除外
縦方向のぼかしマッチングは、ある文字が何であってもよいが、「a」、「b」、「c」、「d」の文字ではなく、正則/[abcd]/で表され、逆を表す.例は次のとおりです.
var reg = /[^abcd]/g;
var str = "safgecdb";
console.log(str.match(reg))
// => ["s", "f", "g", "e"]

3、よくある略語\dは[0-9]です.表示为数字.\Dは[^0-9]です.数字以外の任意の文字を表します.\wは[0-9 a-zA-Z_]です.数字、大文字小文字、下線を表します.\Wは[^0-9 a-zA-Z_]です.単語以外の文字.\sは[tvrf]です.スペース、水平タブ、垂直タブ、改行、折り返し、改ページを含む空白を表します.\Sは[^tvrf]です.空白以外の文字..は[^ru 2028u 2029]です.ほぼ任意の文字を表すワイルドカード.改行、折り返し、行区切り、セグメント区切りを除きます.
三、量詞
1、略記形式{m,}少なくともm回出現する.{m}は{m,m}に等価であり、m回出現する.?は{0,1}に等しく、出現または出現しない.+は{1,}に等価であり、少なくとも1回出現することを示す.*は{0,}に等価であり、出現しなくてもよいし、何度も出現してもよいし、任意の回である.
2、貪欲マッチングと不活性マッチング
例は次のとおりです.
var reg = /\d{2,5}/g;
var str = "123 1234 12345 123456";
console.log(str.match(reg))
// => ["123", "1234", "12345", "12345"]

上の例では2~5個の数字を表していますが、2桁、3桁、4桁、5桁の数字でもいいです.この範囲内であれば、できるだけ多くの数字を一致させることができますが、このような一致方式は必要ありません.量詞の後ろに「?」を付けることができます.このモードを解除します.例は次のとおりです.
var reg = /\d{2,5}?/g;
var str = "123 1234 12345 123456";
console.log(str.match(reg))
// => ["12", "12", "34", "12", "34", "12", "34", "56"]

四、複数選択分岐
1つのモードは、横方向および縦方向のぼかしマッチングを実現することができる.一方、複数選択ブランチは、複数のサブモードのいずれかをサポートすることができる.
例えば(a|b|c)この方式は、「a」または「b」または「c」のいずれかのシードパターンに一致する.|はパイプシンボルの意味である.例は以下の通りである.
var reg = /good|nice/g;
var str = "good idea, nice try";
console.log(str.match(reg))
// => ["good", "nice"]

正則/good|goodbye/で「goodbye」をマッチングすると、次のような結果になります.
var reg = /good|goodbye/g;
var str = "goodbye";
console.log(str.match(reg))
// =>  ["good"]

爆正則を/goodbye|good/に変更する必要があります.以下のようにします.
var reg = /goodbye|good/g;
var str = "goodbye";
console.log(str.match(reg))
// =>  ["goodbye"]

パイプシンボルマッチングというモードも不活性であり,前が条件に合致すれば後に一致しないことがわかる.
五、ケーススタディ
1、16進数の色の値に一致する
16進数文字を表し、文字グループ[0-9 a-fA-F]を使用できます.ここで文字は3回または6回現れることができ、量詞と分岐構造が必要である.
例は次のとおりです.
var reg = /#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})/g;
var str = "#ffbbad #Fc01DF #FFF #ffE";
console.log( str.match(reg) ); 
// => ["#ffbbad", "#Fc01DF", "#FFF", "#ffE"]

2、マッチングid
「id=」containerを取り出すように要求されます.var reg = /id=".*"/ var str = ' '; console.log(str.match(reg)[0]); // => id="container" class="main"
上記の例では、正則的な貪欲モードを解除していません.貪欲モードを解除する正則は以下の通りです.var reg = /id=".*?"/ var str = ' '; console.log(str.match(reg)[0]); // => id="container"
我々は我々が望んでいるものを得たが,効率は比較的低く,正則には「遡及」という概念があり,その原理を利用して上の正則を以下のように最適化することができる.var reg = /id="[^"]*"/ var str = ' '; console.log(str.match(reg)[0]); // => id="container"