ホームページ > 記事 > ウェブフロントエンド > JS 正規表現での RegExp オブジェクトと括弧の使用について
次の記事では、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: 式「b6c5a531a458a2e790c1fd6421739d1c(.*)b90dd5946f0946207856a8a37f441edf」および文字列「b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846beeaa94b3e26ee717c64999d7867364b1b4a3gt;e388a4556c0f65e1904146cc1a846beebb94b3e26ee717c64999d7867364b1b4a3b90dd5946f0946207856a8a37f441edf" 一致した場合、一致結果は成功です。一致した内容は "9aff2e297053af18112c5bb5bf8317864f8426b303fd482c2b5cad5323c6ce0d b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846beebb94b3e26ee717c64999d7867364b1b4a3b90dd5946f0946207856a8a37f441edf" 式内の "" は文字列内の最後の "<" と同じになります。 /td>」が一致します。
例 2: 対照的に、式「b6c5a531a458a2e790c1fd6421739d1c(.*?)b90dd5946f0946207856a8a37f441edf」が例 1 の同じ文字列と一致する場合、「b6c5a531a458a2e790c1fd6421739d1ce388a4556c0f65e1904146cc1a846bee aabe8ac636fb1b87fce4304e98e8db0951b90dd5946f0946207856a8a37f441edf"、次を再度マッチングすると、2番目の"
2.2 バックリファレンス /1, /2...
式が一致すると、式エンジンは括弧 "( )" に含まれる式と一致した文字列を記録します。マッチング結果を取得する際、括弧内の表現と一致した文字列を別途取得することができます。これは、前の例で何度も実証されています。実際のアプリケーションでは、ある境界を使って検索し、取得したい内容にその境界が含まれない場合には、括弧を使って範囲を指定する必要があります。たとえば、前の「b6c5a531a458a2e790c1fd6421739d1c(.*?)b90dd5946f0946207856a8a37f441edf」。
実は、「括弧内に含まれる式と一致した文字列」は、マッチング完了後に利用できるだけでなく、マッチング処理中にも利用することができます。式の後の部分は、前の「文字列とすでに一致した括弧内の部分一致」を参照できます。参照方法は「/」+数字です。 「/1」は最初の角括弧のペアで一致する文字列を指し、「/2」は 2 番目の角括弧のペアで一致する文字列を指します...というように、角括弧のペアに別の角括弧のペアが含まれる場合も同様です。外側のペア レイヤの括弧が最初にソートされます。つまり、左括弧 "(" が最初にあるペアが最初にソートされます。
例は次のとおりです。
例 1: 式 "('|")(.*?)(/ 1 )" " 'Hello', "World" " を照合した場合、照合結果は成功です。照合内容は " 'Hello' " です。次の照合を再度行うと、" "World" が照合できます。
例 2: 式「(/w)/1{4,}」が「aa bbbb abcdefg ccccc 111121111 999999999」と一致した場合、一致結果は次のようになります。一致した内容が再び「ccccc」の場合は、999999999 が返されます。この式では、「/w」範囲の文字を少なくとも 5 回繰り返す必要があります。
例 3: 式 "b003ecc62e7e1bd16932ee929059e163b90dd5946f0946207856a8a37f441edf」の場合、マッチング結果は「b6c5a531a458a2e790c1fd6421739d1c」と一致しない場合、他のマッチングに変更するとマッチングは失敗します。正常に一致する可能性があります
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」を使用した場合と同じ効果があります。
逆方向事前検索: "(?692547d8a0644831644ec04c1f40af7f/: 多くのプログラミング言語でエスケープ文字として使用されます。一般的に、
/ 記号の後に通常の文字 c が続く場合、/c は特別な意味を表します。たとえば、n は本来文字 n を表しますが、/n は改行を表します。
/ 記号の後に特殊文字 c が続く場合、/c は通常の文字 c を表します。たとえば、/ は通常エスケープ文字として使用されますが、// は通常の文字 / を表します。
JavaScript の正規表現での / の使用法は、特殊文字テーブルがプログラミング言語によって異なる場合があることを除いて、上記と同じです。
2>^:匹配输入字符串的起始端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符后匹配。
例子:
/^B/匹配 “Bab Bc ”中的第一个B
例子2:
/^B/gm匹配
“Badd B
cdaf
B dsfB”
中的第一行第一个B,第三行中的第一个B
3>$:匹配输入字符创的尾端,如果是多行匹配,即表达式的附加参数中含有m,则也在一个换行符前匹配。
与^的用法相反。
例子:/t$/匹配“bat”中的t,但是不匹配“hate”中的t
例子2:/t$/匹配
“tag at
bat”
中第一行的最后一个t和第二行的t。
4>*:匹配前一个字符0次或多次。
例子:/ab*/匹配“dddabbbbc”中的“abbbb”,也匹配“ddda”中的“a”
5>+:匹配前一个字符1次或多次。
例子:/ab+/匹配“dddabbbbc”中的“abbbb”,但不匹配“ddda”
与后面的{1,}(原型:{n,})的用法类似
6>?:?的用法比较特殊,一般来说它用来对前一个字符做0次或1次匹配,但是它有另外两种特殊的用法:
如果紧跟在*、+、?和{ }之后,则表示原始匹配的最小次数匹配,例如:
/ba*/本来匹配“bbbaaaa”中的“baaaa”,但是/ba*?/则匹配“bbbaaaa”中的“b”(因为*表示0次或多次匹配,而加?应该表示最少次数匹配,即0次匹配)。
同理:/ba+?/则匹配“baaaa”中的“ba”。
作为语法结构符号,使用于前置断言中,即后面要说到的x(?=y)和x(?!=y)
7>.:小数点中的“.”号,匹配任何一个单独的字符,但是换行符除外。
标准中总共有哪些字符?请参考:字符集
例如:/a.b/匹配“acbaa”中的“acb”,但是不匹配“abbb”。
8>(x):表示匹配x(并非特指字符x或者特指一个字符,x表示一个字符串),而且匹配会被记住,在语法中这种()被称为“capturing parentheses ”,即捕捉用的小括号。
匹配会被记住,是因为在表达式提供的函数中,有些函数返回一个数组,该数组会保存所匹配的所有字符串,例如exec()函数。
另外还要注意()中的x被记住的前提是匹配x。
例子1:
var regx=/a(b)c/; var rs=regx.exec(“abcddd”);
从上面可以看出,/a(b)c/匹配“abcddd”中的“abc”,因为()的原因,b也会记录下来,因此rs返回的数字内容为:
{abc,b}
例子2:
var regx=/a(b)c/; var rs=regx.exec(“acbcddd”);
rs返回null,因为/a(b)c/不匹配“acbcddd”,所以()中的b不会被记录下来(尽管字符串中含有b)
9>(?:x):匹配x,但不会记住x,这种格式中的()被称为“non-capturing parentheses ”,即非捕捉用的小括号。
例子:
var regx=/a(?:b)c/; var rs=regx.exec(“abcddd”);
从上面可以看出,/a(?:b)c/匹配“abcddd”中的“abc”,因为(?:)的原因,b不会记录下来,因此rs返回的数字内容为:
{abc}
10>X(?=y):匹配x,仅当后面紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。
例子:
var regx=/user(?=name)/; var rs=regx.exec(“The username is Mary”);
结果:匹配成功,而且rs的值为{user}
11>X(?!y):匹配x,仅当后面不紧跟着y时。如果符合匹配,则只有x会被记住,y不会被记住。
例子:
var regx=/user(?!name)/; var rs=regx.exec(“The user name is Mary”);
结果:匹配成功,而且rs的值为{user}
例子2:
var regx=//d+(?!/.)/; var rs=regx.exec(“54.235”);
结果:匹配成果,rs的值为{5},不匹配54是因为54后面跟着“.”号,当然235也匹配,但是由于exec方法的行为,235不会被返回
12>x|y:匹配x或y。注意如果x和y都匹配上了,那么只记住x。
例子:
var regx=/beijing|shanghai/; var rs=regx.exec(“I love beijing and shanghai”);
结果:匹配成功,rs的值为{beijing},虽然shanghai也匹配,但不会被记住。
13>{n}:匹配前一个字符的n次出现。
n必须是一个非负数,当然如果是一个负数或小数也不会报语法错误。
例子:
var regx=/ab{2}c/; var rs=regx.exec(“abbcd”);
结果:匹配成功,rs的值为:{abbc}。
14>{n,}:匹配前一个字符的至少n次出现。
例子:
var regx=/ab{2,}c/; var rs=regx.exec(“abbcdabbbc”);
结果:匹配成功,rs的值为:{abbc}。注意为什么abbbc也符合条件为什么没有被记住,这与exec方法的行为有关,后面会统一讲解。
15>{n,m}:匹配前一个字符的至少n次最多m次的出现。
只要n与m为数字,而且m>=n就不会报语法错误。
例子:
var regx=/ab{2,5}c/; var rs=regx.exec(“abbbcd”);
结果:匹配成功,rs的值为:{abbbc}。
例子2:
var regx=/ab{2,2}c/; var rs=regx.exec(“abbcd”);
结果:匹配成功,rs的值为:{abbc}。
例子3:
var regx=/ab(2,5)/; var rs=regx.exec(“abbbbbbbbbb”);
结果:匹配成功,rs的值为:{abbbbb},这说明,如果前一个字符出现多于m次,则只匹配m次。另外:
var regx=/ab(2,5)c/;
var rs=regx.exec(“abbbbbbbbbbc”);
结果:匹配失败,rs的值为:null,为什么匹配失败,因为b多于5个则b(2,5)会匹配前5个b,,而表达式/ab(2,5)c/中b后面是c,但字符串中5个b之后还是b所以会报错。
16>[xyz]:xyz表示一个字符串,该模式表示匹配[]中的一个字符,形式上[xyz]等同于[x-z]。
例子:
var regx=/a[bc]d/; var rs=regx.exec(“abddgg”);
结果:匹配成功,rs的值为:{abd}
例子2:
var regx=/a[bc]d/; var rs=regx.exec(“abcd”);
结果:匹配失败,rs的值为:null,之所以失败,是因为[bc]表示匹配b或c中的一个,但不会同时匹配。
17>[^xyz]:该模式表示匹配非[]中的一个字符,形式上[^xyz]等同于[^x-z]。
例子:
var regx=/a[^bc]d/; var rs=regx.exec(“afddgg”);
结果:匹配成功,rs的值为:{afd}
例子2:
var regx=/a[^bc]d/; var rs=regx.exec(“abd”);
结果:匹配失败,rs的值为:。
18>[/b]:匹配退格键。
19>/b:匹配一个词的边界符,例如空格和换行符等等,当然匹配换行符时,表达式应该附加参数m。
例子:
var regx=//bc./; var rs=regx.exec(“Beijing is a beautiful city”);
结果:匹配成功,rs的值为:{ci},注意c前边的空格不会匹配到结果中,即{ ci}是不正确的。
20>/B:代表一个非单词边界。
例子:
var regx=//Bi./; var rs=regx.exec(“Beijing is a beautiful city”);
结果:匹配成功,rs的值为:{ij},即匹配了Beijing中的ij。
21>/cX,匹配一个控制字符。例如, /cM 匹配一个 Control-M 或
回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一
个原义的 'c' 字符。(实际的例子还需补充)
21>/d:匹配一个数字字符,等同于[0-9]。
例子:
var regx=/user/d/; var rs=regx.exec(“user1”);
结果:匹配成功,rs的值为:{user1}
22>/D:匹配一个非数字字符,等同于[^0-9]。
例子:
var regx=/user/D/; var rs=regx.exec(“userA”);
结果:匹配成功,rs的值为:{userA}
23>/f:匹配一个换页符。
24>/n:匹配一个换行符。因为是换行符,所以在表达式中要加入m参数。
例子:
var regx=/a/nbc/m; var str=“a bc”; var rs=regx.exec(str);
结果:匹配成功,rs的值为:{ },如果表达式为/a/n/rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。
25>/r:匹配一个回车符
26>/s:匹配一个空格符,等同于[ /f/n/r/t/v/u00A0/u2028/u2029].
例子:
var regx=//si/; var rs=regx.exec(“Beijing is a city”);
结果:匹配成功,rs的值为:{ i}
27>/S:匹配一个非空格符,等同于[ ^/f/n/r/t/v/u00A0/u2028/u2029].
例子:
var regx=//si/; var rs=regx.exec(“Beijing is a city”);
结果:匹配成功,rs的值为:{ei}
28>/t:匹配一个tab
例子:
var regx=/a/tb/; var rs=regx.exec(“a bc”);
结果:匹配成功,rs的值为: {a bc}
29>/v:匹配一个竖向的tab
30>/w:匹配一个数字、_或字母表字符,即[A-Za-z0-9_ ]。
例子:
var regx=//w/; var rs=regx.exec(“$25.23”);
结果:匹配成功,rs的值为:{2}
31>/W:匹配一个非数字、_或字母表字符,即[^A-Za-z0-9_ ]。
例子:
var regx=//w/; var rs=regx.exec(“$25.23”);
结果:匹配成功,rs的值为:{$}
32>/n:注意不是/n,这里n是一个正整数,表示匹配第n个()中的字符。
例子:
var regx=/user([,-])group/1role/; var rs=regx.exec(“user-group-role”);
结果:匹配成功,rs的值为:{user-group-role,-},同样对user,group,role的匹配也是成功的,但像user-group,role等就不对了。
33>/0:匹配一个NUL字符。
34>/xhh:匹配一个由两位16进制数字所表达的字符。
35>/uhhhh:匹配一个由四位16进制数字所表达的字符。
3,表达式操作
1)表达式操作,在这里是指和表达式相关的方法,我们将介绍六个方法。
2)表达式对象(RegExp)方法:
1>exec(str),返回str中与表达式相匹配的第一个字符串,而且以数组的形式表现,当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:
var regx=//d+/; var rs=regx.exec(“3432ddf53”);
返回的rs值为:{3432}
var regx2=new RegExp(“ab(/d+)c”); var rs2=regx2.exec(“ab234c44”);
返回的rs值为:{ab234c,234}
另外,如果有多个合适的匹配,则第一次执行exec返回一个第一个匹配,此时继续执行exec,则依次返回第二个第三个匹配。例如:
var regx=/user/d/g; var rs=regx.exec(“ddduser1dsfuser2dd”); var rs1=regx.exec(“ddduser1dsfuser2dd”);
则rs的值为{user1},rs的值为{rs2},当然注意regx中的g参数是必须的,否则无论exec执行多少次,都返回第一个匹配。后面还有相关内容涉及到对此想象的解释。
2>test(str),判断字符串str是否匹配表达式,返回一个布尔值。例如:
var regx=/user/d+/g; var flag=regx.test(“user12dd”);
flag的值为true。
3)String对象方法
1>match(expr),返回与expr相匹配的一个字符串数组,如果没有加参数g,则返回第一个匹配,加入参数g则返回所有的匹配
例子:
var regx=/user/d/g; var str=“user13userddduser345”; var rs=str.match(regx);
rs的值为:{user1,user3}
2>search(expr),返回字符串中与expr相匹配的第一个匹配的index值。
例子:
var regx=/user/d/g; var str=“user13userddduser345”; var rs=str.search(regx);
rs的值为:0
3>replace(expr,str),将字符串中匹配expr的部分替换为str。另外在replace方法中,str中可以含有一种变量符号$,格式为$n,代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
例子:
var regx=/user/d/g; var str=“user13userddduser345”; var rs=str.replace(regx,”00”);
rs的值为:003userddd0045
例子2:
var regx=/u(se)r/d/g; var str=“user13userddduser345”; var rs=str.replace(regx,”$1”);
rs的值为:se3userdddse45
对于replace(expr,str)方法还要特别注意一点,如果expr是一个表达式对象则会进行全局替换(此时表达式必须附加参数g,否则也只是替换第一个匹配),如果expr是一个字符串对象,则只会替换第一个匹配的部分,例如:
var regx=“user” var str=“user13userddduser345”; var rs=str.replace(regx,”00”);
rs的值为: 0013userddduser345
4>split(expr),将字符串以匹配expr的部分做分割,返回一个数组,而且表达式是否附加参数g都没有关系,结果是一样的。
例子:
var regx=/user/d/g; var str=“user13userddduser345”; var rs=str.split(regx);
rs的值为:{3userddd,45}
4,表达式相关属性
1)表达式相关属性,是指和表达式相关的属性,如下面的形式:
var regx=/myexpr/; var rs=regx.exec(str);
其中,和表达式自身regx相关的属性有两个,和表达式匹配结果rs相关的属性有三个,下面将逐一介绍。
2)和表达式自身相关的两个属性:
1>lastIndex,返回开始下一个匹配的位置,注意必须是全局匹配(表达式中带有g参数)时,lastIndex才会有不断返回下一个匹配值,否则该值为总是返回第一个下一个匹配位置,例如:
var regx=/user/d/; var rs=regx.exec(“sdsfuser1dfsfuser2”); var lastIndex1=regx.lastIndex; rs=regx.exec(“sdsfuser1dfsfuser2”); var lastIndex2=regx.lastIndex; rs=regx.exec(“sdsfuser1dfsfuser2”); var lastIndex3=regx.lastIndex;
上面lastIndex1为9,第二个lastIndex2也为9,第三个也是9;如果regx=/user/d/g,则第一个为9,第二个为18,第三个为0。
2>source,返回表达式字符串自身。例如:
var regx=/user/d/; var rs=regx.exec(“sdsfuser1dfsfuser2”); var source=regx.source;
source的值为user/d
3)和匹配结果相关的三个属性:
1>index,返回当前匹配的位置。例如:
var regx=/user/d/; var rs=regx.exec(“sdsfuser1dfsfuser2”); var index1=rs.index; rs=regx.exec(“sdsfuser1dfsfuser2”); var index2=rs.index; rs=regx.exec(“sdsfuser1dfsfuser2”); var index3=rs.index;
index1为4,index2为4,index3为4,如果表达式加入参数g,则index1为4,index2为13,index3会报错(index为空或不是对象)。
2>input,用于匹配的字符串。例如:
var regx=/user/d/; var rs=regx.exec(“sdsfuser1dfsfuser2”); var input=rs.input;
input的值为sdsfuser1dfsfuser2。
3>[0],返回匹配结果中的第一个匹配值,对于match而言可能返回一个多值的数字,则除了[0]外,还可以取[1]、[2]等等。例如:
var regx=/user/d/; var rs=regx.exec(“sdsfuser1dfsfuser2”); var value1=rs[0]; rs=regx.exec(“sdsfuser1dfsfuser2”); var value2=rs[0];
value1的值为user1,value2的值为user2
5,实际应用
1)实际应用一
描述:有一表单,其中有一个“用户名”input域
要求:汉字,而且不能少于2个汉字,不能多于4个汉字。
实现:
<script> function checkForm(obj){ var username=obj.username.value; var regx=/^[/u4e00-/u9fa5]{2,4}$/g if(!regx.test(username)){ alert(“Invalid username!”); return false; } return true; } </script> <form name=“myForm”onSubmit=“return checkForm(this)”> <input type=“text” name=“username”/> <input type=“submit” vlaue=“submit”/> </form>
2)实际应用二
描述:给定一个含有html标记的字符串,要求将其中的html标记去掉。
实现:
<script> function toPlainText(htmlStr){ var regx=/<[^>]*>|<//[^>]*>/gm; var str=htmlStr.replace(regx,""); return str; } </script> <form name=“myForm”> <textarea id=“htmlInput”></textarea> <input type=“button” value=“submit” onclick=“toPlainText(document.getElementById(‘htmlInput').value”/> </form>
三,小结
1,Javascript正则表达式,我想在一般的程序员之中,使用者应该不是很多,因为我们处理的页面一般都不是很复杂,而复杂的逻辑一般我们都在后台处理完成了。但是目前趋势已经出现了扭转,富客户端已经被越来越多的人接受,而Javascript就是其中的关键技术,对于复杂的客户端逻辑而言,正则表达式的作用也是很关键的,同时它也是Javascript高手必须要掌握的重要技术之一。
2,为了能够便于大家对前面讲述的内容有一个更为综合和深刻的认识,我将前面的一些关键点和容易犯糊涂的地方再系统总结一下,这部分很关键!
总结1:附件参数g的用法
表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详细叙述:
1)对于表达式对象的exec方法,不加入g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。例如
var regx=/user/d/; var str=“user18dsdfuser2dsfsd”; var rs=regx.exec(str);//此时rs的值为{user1} var rs2=regx.exec(str);//此时rs的值依然为{user1}
如果regx=/user/d/g;则rs的值为{user1},rs2的值为{user2}
通过这个例子说明:对于exec方法,表达式加入了g,并不是说执行exec方法就可以返回所有的匹配,而是说加入了g之后,我可以通过某种方式得到所有的匹配,这里的“方式”对于exec而言,就是依次执行这个方法即可。
2)对于表达式对象的test方法,加入g于不加上g没有什么区别。
3)对于String对象的match方法,不加入g,也只是返回第一个匹配,一直执行match方法也总是返回第一个匹配,加入g,则一次返回所有的匹配(注意这与表达式对象的exec方法不同,对于exec而言,表达式即使加上了g,也不会一次返回所有的匹配)。例如:
var regx=/user/d/; var str=“user1sdfsffuser2dfsdf”; var rs=str.match(regx);//此时rs的值为{user1} var rs2=str.match(regx);//此时rs的值依然为{user1}
如果regx=/user/d/g,则rs的值为{user1,user2},rs2的值也为{user1,user2}
4)对于String对象的replace方法,表达式不加入g,则只替换第一个匹配,如果加入g,则替换所有匹配。(开头的三道测试题能很好的说明这一点)
5)对于String对象的split方法,加上g与不加g是一样的,即:
var sep=/user/d/; var array=“user1dfsfuser2dfsf”.split(sep);
则array的值为{dfsf, dfsf}
此时sep=/user/d/g,返回值是一样的。
6)对于String对象的search方法,加不加g也是一样的。
总结2:附加参数m的用法
附加参数m,表明可以进行多行匹配,但是这个只有当使用^和$模式时才会起作用,在其他的模式中,加不加入m都可以进行多行匹配(其实说多行的字符串也是一个普通字符串),我们举例说明这一点
1)使用^的例子
var regx=/^b./g; var str=“bd76 dfsdf sdfsdfs dffs b76dsf sdfsdf”; var rs=str.match(regx);
此时加入g和不加入g,都只返回第一个匹配{bd},如果regx=/^b./gm,则返回所有的匹配{bd,b7},注意如果regx=/^b./m,则也只返回第一个匹配。所以,加入m表明可以进行多行匹配,加入g表明可以进行全局匹配,综合到一起就是可以进行多行全局匹配
2)使用其他模式的例子,例如
var regx=/user/d/; var str=“sdfsfsdfsdf sdfsuser3 dffs b76dsf user6”; var rs=str.match(regx);
此时不加参数g,则返回{user3},加入参数g返回{user3,user6},加不加入m对此没有影响。
3)因此对于m我们要清楚它的使用,记住它只对^和$模式起作用,在这两种模式中,m的作用为:如果不加入m,则只能在第一行进行匹配,如果加入m则可以在所有的行进行匹配。我们再看一个^的例子
var regx=/^b./; var str=“ret76 dfsdf bjfsdfs dffs b76dsf sdfsdf”; var rs=str.match(regx);
此时rs的值为null,如果加入g,rs的值仍然为null,如果加入m,则rs的值为{bj}(也就是说,在第一行没有找到匹配,因为有参数m,所以可以继续去下面的行去找是否有匹配),如果m和g都加上,则返回{bj,b7}(只加m不加g说明,可以去多行进行匹配,但是找到一个匹配后就返回,加入g表明将多行中所有的匹配返回,当然对于match方法是如此,对于exec呢,则需要执行多次才能依次返回)
总结3:
在HTML的textarea输入域中,按一个Enter键,对应的控制字符为“/r/n”,即“回车换行”,而不是“/n/r”,即“换行回车”,我们看一个前面我们举过的例子:
var regx=/a/r/nbc/; var str=“a bc”; var rs=regx.exec(str);
结果:匹配成功,rs的值为:{ },如果表达式为/a/n/rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がJS 正規表現での RegExp オブジェクトと括弧の使用についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。