次の記事では、JS 正規表現での RegExp オブジェクトと括弧の使用について簡単に説明します。内容がとても良かったので、参考としてシェアさせていただきます。
RegExp オブジェクトの作成:
従来の正規表現は、直接量、つまりスラッシュ「/」で囲まれた文字を使用して作成できます。ただし、パラメーターの変更が必要な環境では、 RegExp() コンストラクターの方が適切な選択です。
var reg1 = /'w+'/g;
var reg2 = new RegExp(''\w+'','g' );
2 つの作成方法を比較すると、RegExp の最初のパラメータは作成される通常の文字列であるため、スラッシュ「/」と引用符で囲まれていないことに注意してください。マーク「 ' 」とエスケープ記号「 」は文字列内で 2 回エスケープする必要があります。
さらに、直接変数であっても RegExp() コンストラクターであっても、新しい RegExp オブジェクトが生成され、変数に割り当てられます。
match() と exec() の類似点と相違点:
match と exec は、正規表現を使用して文字列を照合するための一般的な方法です。 2 つによって実装される関数は似ていますが、いくつかの微妙な違いがあります:
1. 使用法
match は文字列パッケージ化オブジェクトのメソッドです。使用法: String.match(RegExp);
exec は正規表現です。 object メソッド、使用法: RegExp.exec(String);
2. 返される結果
RegExp がグローバル フラグ "g" を設定しない場合:
両方の返される結果は同じです。つまり、一致する値がない場合は null が返され、一致する値がある場合は配列 (let 配列) が返されます。 array[0] は一致する文字列で、array[1]、array[2]... は正規表現の括弧で囲まれた部分文字列 $1、$2... に対応します。同時に、配列には 2 つの属性があり、array.index は一致する文字列の最初の位置を表し、array.input は取得される文字列を表します。
RegExp にグローバル フラグ "g" が設定されている場合:
match は値があれば配列を返します。配列内の各項目は、一致したすべての文字列を順番に表すため、括弧で囲まれた部分文字列はそれ以上一致しません。このとき、配列にはインデックス属性と入力属性はありません。
exec は、グローバル フラグ "g" がない場合と同じように動作します。この時点で返されるのは配列 array で、array[0] は現在一致している文字列、array[1]、array[2]... は現在の一致の下の括弧内に一致している文字列です。このとき、元の文字列内で一致した文字列の末尾以降の位置を表す RegExp オブジェクトの lastIndex 属性に注目してください。他に一致する結果が存在しない場合、lastIndex 属性は 0 に設定されます。したがって、lastIndex ループを使用して、一致する文字列をすべて検索できます。
複数のマッチングメソッドをサポートします:
jsコード
var testStr = "now test001 test002"; var re = /test(\d+)/ig; var r = ""; while(r = re.exec(testStr)) { alert(r[0] + " " + r[1]); }
さらに、testStr.match(re)を使用することもできますが、この場合、 g オプションを指定すると、最初に一致したもののみが取得されます。
1. 正規表現の規則
1.1 通常の文字
以下の章で特に定義されていない文字、数字、漢字、アンダースコア、および句読点はすべて「通常の文字」です。式内の通常の文字は、文字列と一致する場合、同じ文字と一致します。 例 1: 式「c」、文字列「abcde」と一致する場合、一致結果は成功、一致した内容は「c」、一致した位置は 2 から始まり 3 で終わります。 (注: 添字が 0 から始まるか 1 から始まるかは、現在のプログラミング言語によって異なる場合があります) 例 2: 式 "bcd" が文字列 "abcde" と一致した場合、一致結果は次のようになります。は: "bcd"; 一致する位置は: 1 から始まり 4 で終わります。1.2 簡易エスケープ文字
一部の書きにくい文字については、先頭に「/」を追加する方法を使用してください。実際、私たちはこれらのキャラクターをよく知っています。expression | は | |||||||||||||||||||||||||||||||
/rと一致できます、/n | はキャリッジリターンとラインフィードを表します | |||||||||||||||||||||||||||||||
/t | タブ | |||||||||||||||||||||||||||||||
// | は「/」そのものを表します |
expression | は |
/^ | ^記号自体と一致します |
/$ | $ 記号そのものと一致します |
/. | は、小数点(.)そのものと一致します |
これらのエスケープ文字の一致方法は、「通常の文字」と同様です。同じ文字にも一致します。
例 1: 式「/$d」、文字列「abc$de」と一致する場合、一致結果は次のとおりです。一致した内容は「$d」です。一致した位置は 3 から始まり、終了します。 5時に。
1.3 「複数の文字」に一致する式
正規表現の一部の表現方法は、「複数の文字」のいずれか 1 つに一致します。たとえば、式「/d」は任意の数値と一致します。どの文字とも一致しますが、一致できるのは 1 つだけであり、複数にすることはできません。これは、ポーカーをプレイするようなものです。キングとキングはどのカードでも置き換えることができますが、置き換えることができるのは 1 枚のカードだけです。
式 | は |
/d | 0から9までの任意の数値 |
/wと一致します | 任意の文字、数字、またはアンダースコアつまり、A~Z、a~z、0~9、_ |
/s | (スペース、タブ、フォームフィード、その他の空白文字を含む) のいずれか |
. | 小数点は、改行文字 (/n) を除く任意の文字と一致します。 |
例 1: 式 "/d/d"、一致する場合 "abc123" が使用される場合、一致結果: 成功; 一致した内容: 「12」; 一致した位置: 3 から始まり 5 で終わります。
例 2: 式「a./d」が「aaa100」と一致する場合、一致結果は「成功」、一致した内容は「aa1」、一致した位置は 1 から始まり 4 で終わります。
1.4 「複数の文字」に一致するカスタム式
角括弧 [ ] を使用して、任意の 1 文字に一致する一連の文字を含めます。 [^] を使用して、それらの文字を除く任意の文字と一致する一連の文字を含めます。同様に、それらのいずれかを一致させることはできますが、一致できるのは 1 つだけであり、複数ではありません。
expression | は |
[ab5@]と一致します | は「a」、「b」、「5」、または「@」と一致します |
[^ abc] | は、「a」、「b」、「c」を除く任意の文字と一致します |
[f-k] | は、「f」~「k」と一致します 任意の文字 |
[^A-F0-3] | は、「A」~「F」、「0」~「3」を除く任意の文字 |
例 1: 式 "[bcd][bcd]" が "abc123" と一致する場合、一致結果は次のようになります: 一致した内容は次のようになります: "bc"; 一致した位置は次のようになります: 1 から始まり 3 で終わります。
例 2: 式「[^abc]」が「abc123」と一致する場合、一致結果は「成功」、一致した内容は「1」、一致した位置は 3 から始まり 4 で終わります。
1.5 一致の数を変更する特殊記号
前の章で説明した式は、1 種類の文字のみと一致するか、複数の文字のいずれか 1 つと一致するかにかかわらず、一致できるのは 1 回だけです。式と一致の数を変更する特殊記号を使用すると、式を再度記述しなくても、繰り返し一致させることができます。
使用方法は、「修飾式」の後に「修飾回数」を入れます。たとえば、「[bcd][bcd]」は「[bcd]{2}」と書くことができます。
式 | 関数 |
{n} | 式をn回繰り返します。例: "/w{2}" は "/w/w" と同等です。 「a{5}」は「aaaa」と同等です |
{m,n} | この式は少なくとも m 回、最大で n 回繰り返されます。たとえば、「ba{1,3」です。 }" は、"ba" または "baa" または "baaa" に一致します |
{m,} | 式は少なくとも m 回繰り返されます。例: "/w/d{2,} " は、"a12"、"_456"、"M12344" と一致します... |
? | は、式と 0 回または 1 回一致し、{0,1} に相当します。例: "a[ cd]?" は、"a","ac","ad" と一致します |
+ | 式は少なくとも 1 回出現し、{1,} と同等です。例: "a+b" は、 match "ab", "aab ","aaab"... |
* | この式は出現しないか、何度でも出現します。{0,} に相当します。例: "/ ^*b" は "b"、" ^^^b" と一致します... |
例 1: 式 "/d+/.?/d*" が "Itcost $12.5" と一致する場合、一致する結果: 成功; 一致した内容: 「12.5」; 一致した位置: 10 から始まり 14 で終わります。
例 2: 式「go{2,8}gle」が「Ads by goooooogle」と一致する場合、一致結果は次のとおりです。一致したコンテンツは「goooooogle」です。一致した位置は 7 から始まり、終了します。 17時。
1.6 抽象的な意味を表すその他の特殊記号
一部の記号は、式内の抽象的な特殊な意味を表します:
expression | function |
^ | の先頭に一致します文字列、どの文字とも一致しません |
$ | 文字列の末尾と一致します、どの文字とも一致しません |
/b | は 1 つの Word 境界と一致します。単語とスペースの間の位置、どの文字とも一致しません |
これ以上のテキストの説明はまだ比較的抽象的であるため、誰もが理解できるように例を示します。
例 1: 式「^aaa」が「xxx aaa xxx」と一致する場合、一致結果は失敗になります。 「^」は文字列の先頭と一致する必要があるため、「^aaa」は「aaa xxx xxx」のように「aaa」が文字列の先頭にある場合にのみ一致します。
例 2: 式「aaa$」が「xxx aaa xxx」と一致する場合、一致結果は失敗となります。 「$」は文字列の末尾と一致する必要があるため、「aaa$」は「xxx xxx aaa」のように「aaa」が文字列の末尾にある場合にのみ一致します。
例 3: 式「./b.」が「@@@abc」と一致する場合、一致する内容は「@a」です。一致する位置は 2 で始まり、次で終了します。 4.
さらなる説明: 「/b」は「^」や「$」と似ていますが、それ自体はどの文字とも一致しませんが、一致結果の位置の左側と右側にある必要があります。片側が「/w」の範囲、もう一方が「/w」の範囲です。
例 4: 式「/bend/b」が「weekend,endfor,end」と一致する場合、一致する結果は次のとおりです。一致するコンテンツは「end」です。一致する位置は 15 から開始、終了は次のとおりです。 18.
一部のシンボルは、式内の部分式間の関係に影響を与える可能性があります。 左辺と右辺の式「OR」 " それらの間の関係、左側または右側の一致
( ) | (1)。一致の数を変更すると、括弧内の式全体を変更できます (2). マッチング結果を取得する際、括弧内の表現に一致する内容を個別に取得できます |
例5: 表現「Tom|Jack」は文字列「I'm Tom, he is Jack」と一致します。 "、一致結果は成功、一致内容は「Tom」、一致位置は 4 から始まり 7 で終わります。次の一致の場合、一致結果は「成功」、一致した内容は「ジャック」、一致した位置は 15 で始まり 19 で終わります。 | 例 6: 式「(go/s*)+」が「Let's go go go!」と一致する場合、一致結果は次のようになります。一致した内容は「go go go」です。一致した位置は次のようになります。 6時に終わって14時に終わります。 例7: 式「¥(/d+/.?/d*)」が「$10.9,¥20.5」と一致した場合、一致結果は「¥20.5」と一致します。到達点は次のとおりです: 6 から始まり 10 で終わります。ブラケット範囲を別途取得して照合した内容は「20.5」となる。 |
2.1 一致数の貪欲と非貪欲 |
「/w+」は、マッチング時にそのルールに準拠する可能な限り多くの文字と常に一致することがわかります。 2 番目の例では、最後の「d」とは一致しませんが、これは式全体が正常に一致するようにするためです。同様に、「*」と「{m,n}」を含む式は可能な限り一致し、「?」を含む式も一致するかどうかに応じて可能な限り「一致」します。このマッチング原理は「貪欲」モードと呼ばれます。
Non-greedy モード:
一致数を変更する特殊記号の後に「?」記号を追加して、一致数が変動する式の一致を最小限に抑えます。一致するかどうかは、可能な限り「不一致」で一致することができます。このマッチング原理は「非貪欲」モードと呼ばれ、「リラクタント」モードとも呼ばれます。一致する数が少ない場合、式全体は一致しません。貪欲モードと同様に、非貪欲モードでは、式全体が正常に一致するように最小限の一致が行われます。たとえば、テキスト「dxxxdxxxd」の場合、次のようになります:
expression | matching result |
(d)(/w+?) | ?"最初の「d」以降の文字との一致を少なくすると、結果は次のようになります:「/w+?」は 1 つの「x」のみと一致します |
(d)(/w+?)(d) | for 式全体が正常に一致するには、次の「d」が一致する前に、「/w+?」が「xxx」と一致する必要があります。したがって、結果は次のようになります: "/w+?" は "xxx" と一致します |
その他のケースと例は次のとおりです:
例 1: 式「
aa
bb
" 一致した場合、一致結果は成功です。一致した内容は "aa
< /td>bb
例 2: 対照的に、式「
aa<」のみが返されます。 /p>
bb
2.2 バックリファレンス /1, /2...
式が一致すると、式エンジンは括弧 "( )" に含まれる式と一致した文字列を記録します。マッチング結果を取得する際、括弧内の表現と一致した文字列を別途取得することができます。これは、前の例で何度も実証されています。実際のアプリケーションでは、ある境界を使って検索し、取得したい内容にその境界が含まれない場合には、括弧を使って範囲を指定する必要があります。たとえば、前の「
実は、「括弧内に含まれる式と一致した文字列」は、マッチング完了後に利用できるだけでなく、マッチング処理中にも利用することができます。式の後の部分は、前の「文字列とすでに一致した括弧内の部分一致」を参照できます。参照方法は「/」+数字です。 「/1」は最初の角括弧のペアで一致する文字列を指し、「/2」は 2 番目の角括弧のペアで一致する文字列を指します...というように、角括弧のペアに別の角括弧のペアが含まれる場合も同様です。外側のペア レイヤの括弧が最初にソートされます。つまり、左括弧 "(" が最初にあるペアが最初にソートされます。
例は次のとおりです。
例 1: 式 "('|")(.*?)(/ 1 )" " 'Hello', "World" " を照合した場合、照合結果は成功です。照合内容は " 'Hello' " です。次の照合を再度行うと、" "World" が照合できます。
例 2: 式「(/w)/1{4,}」が「aa bbbb abcdefg ccccc 111121111 999999999」と一致した場合、一致結果は次のようになります。一致した内容が再び「ccccc」の場合は、999999999 が返されます。この式では、「/w」範囲の文字を少なくとも 5 回繰り返す必要があります。
例 3: 式 "<(/w+) /s*" (/w+(=('|").*?/4)?/s*)*>.*?/1>" は "
2.3 事前検索、一致なし
前の章では、抽象的な意味を表すいくつかの特殊記号について説明しました。 「 /b 」に共通するのは、文字自体には一致せず、「文字列の両端」または「文字間の隙間」に条件を付けるだけであるということです。この概念を理解すると、次のようになります。この節では引き続き、「両端」や「隙間」に条件を付けた、より柔軟な表現方法を紹介していきます
前方事前検索: "(?=xxxxx)"、"(?!xxxxx)"
形式: 「(?=xxxxx)」は、一致した文字列のうち、それが存在する「隙間」または「両端」に条件を付けます。隙間の右側がxxxxx部分の表現と一致する必要があります。これは、このギャップの追加条件としてのみ使用されるため、このギャップの後の文字と実際に一致する後続の式には影響しません。これは、「/b」の前の文字と一致しないのと似ています。
例 1: 「Windows (?=NT|XP)」という式は、「Windows 98、Windows NT、Windows 2000」と一致します。 「Windows NT」の「Windows」のみに一致し、他の「Windows」の単語は一致しません。
例 2: 式「(/w)((?=/1/1/1)(/1))+」が文字列「aaa ffffff 999999999」と一致する場合、最初の 6 つの「f」と一致します。 4、9 個の「9」のうち最初の 7 個と一致します。この式は次のように解釈できます。文字と数字が 4 回以上繰り返された場合、最後の 2 桁より前の部分が一致します。もちろん、この式はこのように記述する必要はありませんが、デモンストレーションの目的でのみ使用されます。
形式: ギャップの右側にある「(?!xxxxx)」は、式の xxxxx 部分と一致してはなりません。
例3:式「((?!/bstop/b).)+」が「fdjka ljfdl stop fjdsla fdj」と一致する場合、「stop」がない場合は先頭から前まで一致します。文字列 stop" 内の文字列全体と一致します。
例 4: 式「do(?!/w)」が文字列「done, do, Dog」と一致する場合、一致できるのは「do」のみです。この例では、「do」の後に「(?!/w)」を使用すると、「/b」を使用した場合と同じ効果があります。
逆方向事前検索: "(?<=xxxxx)"、"(?
これら 2 つの形式の概念は、逆方向事前検索に必要な条件と似ています。 are : ギャップの「左側」では、2 つの形式はそれぞれ、右側を判断するのではなく、指定された式と一致する必要があるか、一致できない必要があります。 「前方事前検索」と同じです。これらはギャップの追加条件であり、文字自体には一致しません。
例 5: 式「(?<=/d{4})/d+(?=/d{4})」が「1234567890123456」と一致する場合、最初の 4 つの数字と最後の 4 つの数字を除いて一致します。真ん中の8つの数字。 JScript.RegExp は逆事前検索をサポートしていないため、この例を示すことはできません。 Java 1.4 以降の java.util.regex パッケージ、.NET の System.Text. RegularExpressions 名前空間、およびによって推奨される最もシンプルで使いやすい DEELX 通常エンジンなど、他の多くのエンジンが逆事前検索をサポートできます。このサイト。
3. その他の共通ルール
前の説明では触れなかった、さまざまな正規表現エンジンに共通するルールもいくつかあります。
3.1 式では、「/xXX」と「/uXXXX」を使用して文字を表すことができます(「X」は 16 進数を表します)
/xXX0〜255の範囲で番号が付けられた文字、例: スペースは「/x20」で表すことができます | /uXXXX |
任意の文字は「/」で表すことができますu" 式「/s」、「/d」、「/w」、「/b」に「/中」 | 3.2 などの 4 桁の 16 進表現を追加します。同時に、対応する大文字は反対の意味を表します |
式 | は空白文字以外のすべての文字と一致します |
(「/s」は一致できます)各空白文字と一致します) | /D | |||||||||||||||||||||||||||||||
数字以外のすべての文字と一致します | /W | |||||||||||||||||||||||||||||||
すべての文字、数字、アンダースコア以外の文字と一致します | /B | |||||||||||||||||||||||||||||||
は、単語以外の境界、つまり、左側と右側の両方が "/w" の範囲内にある場合、または左側と右側のどちらも "/w" の範囲内にない場合の文字のギャップに一致します。 | 3.3 には式に特別な意味があり、文字自体の文字概要と一致させるには「/」を追加する必要があります
3.5 一般的に使用される式属性設定の概要: Ignorecase、Singleline、Multiline、Global Expression 属性
|