JSにおける正則表現及びpatternの注意事項
RegExpオブジェクトの作成:
従来の正規表現の作成には、棒線で囲まれた文字の直接量が使用されます。しかし、パラメータの変化が要求される環境では、RegExp()構造関数はより良い選択である。
また、直接量でもRegExp()コンストラクタでも、新たなRegExpオブジェクトが生成され、変数に値が与えられます。
「Javascript権威ガイド」では、正規表現の直接量について、ECMAscript 3は毎回同じRegExpオブジェクトに戻ると規定していますので、直接量で作成した正規表現の場合は一例を共有します。ECMAScript 5までは、毎回異なるインスタンスに戻ることを規定しています。
各ブラウザでは、IEは常にECMAScript 5の規定に従い、他のブラウザのより古いバージョンはECMAScript 3の規定に従う。したがって、実際のアプリケーションでは、構造関数を用いて作成する方法が安全です。または、lastIndex属性を使用するときは0に戻ります。
括弧()の使用:
1、グループ分け
個々の項目をサブ表現にまとめて処理する場合、一般的に?、+、*、{n,m}などの重複処理。例を見ます
var reg=/Java(script)/;
式ではscriptを一括処理する。
2、後方参照
すなわち、正規表現では「」(nは参照番号を表します)参照式の前の括弧で一致するテキストです。例を見ます
グループと参照に言及した以上、グループ化だけを行いたいなら、参照したくないなら、利用できます。exp)「形式は、テキストにも参照番号にもマッチしません。例を見ます
3、サブモードマッチング
括弧のマッチングを直接参照したい場合がありますが、サブモードのマッチング機能(権威のあるガイドの中の発信子モードのマッチングは、やや違和感があります。実際には変数の形でマッチしたテキストを置換します)が使用できます。基本的な形式は'n'という形で一致番号nのテキストを置換し、Stringオブジェクト内のreplace()という方法がよく使われています。例を見て、2つの辺で単語を交換します。
一般的な重複マッチ文字は?、+、*、{n,m}はマッチングの過程において,貪欲整合の方法,すなわち結果文字にできるだけ多くマッチするようにした。これに対応するのは、怠け者のマッチングであり、できるだけ少ないマッチング結果となります。フォームを使ってマッチ文字を繰り返した後に疑問符を付けるだけです。よろしいです。n,m}ですか例を見ます
上の結果は同じですが、整合の原理は違います。reg 1では、まずo+がすべての「o」にマッチし、次に「Google」とマッチングして、全体のマッチングを完成させます。reg 2では、o+まず「o」にマッチしてから、文字列の2位から4位(つまり元の文字列の「ooo」)に失敗します。さらにo+第二の「o」にマッチして、成功したら、第三位から第四位まで「Google」にマッチします。これを類推します。最後に文字列全体にマッチします。
全体として覚えておきたいのですが、優先順位から言えば、左から右へ順番が合うようになります。
零幅は断言する:
ゼロ幅の断言の全体的な説明については、博文「正則表現30分入門教程」を参照してください。JSではゼロ幅だけが先行して断言されています。つまりゼロ幅正の予測が先行して断言します。exp)「ゼロとマイナス予測先行断言」(?!「exp」。
「ゼロ幅」とは、マッチした結果の文字に空間を占めないことです。例えば「\w"、\\s」は1つまたは複数の空間を占有し、マッチングされた文字の長さによって決定されます。このような対応する最初の最後の位置は空間を占有しないで、0の幅はこの種類に属します。
「プラス/マイナス予測」とは、断言の中で満足を求める場合をいう。「正」はexpを満足させるという意味で、「負」はexpを満足させないという意味です。
「先行」とは、マッチングされた文字列が前面にあることを指し、ゼロ幅は後に続くと断言します。つまり串の後の部分が満足しているかどうかは断言します。
「断言」とは判断の条件です。
二種の零幅が断言する例を見てください。
同様に、ゼロ幅マイナス予測は先行して断言します。script\b)「scriptで終わらない単語を表します。
また、ゼロ幅がないので、ある文字列の前の部分がどのような条件を満たしているかは判断できません。しかし、JSでは複数の正規表現で実現できます。まず探している列にマッチしてから、先頭からindexまでの文字列を切り取り、後のサブストリングの末尾が必要な条件に合致しているかどうかを判定します。具体的な使い方は別に試してみてもいいです。
match()とexec()の異同:
matchとexecは正規表現とマッチする文字列の一般的な方法である。両者が実現する機能は似ていますが、細かい違いがあります。
1、使い方
matchは文字列の包装対象の方法で、使い方:String.match(RegExp);
execは正規表現オブジェクトの方法で、使い方:RegExp.exec(String);
2、戻りの結果
RegExpにグローバルフラグ「g」が設定されていない場合:
両者の戻りは同じだった。つまり、マッチング値がない場合はnullを返し、マッチング値がある場合は配列を返します。array[0]はマッチする文字列で、array[1]、array[2]......は正規表現の中の丸括弧にマッチするサブ文字列$1、$2に対応します。配列には2つの属性があり、array.indexはマッチング文字列の初期位置を表し、array.inputは検索中の文字列を表しています。
RegExpにグローバルフラグ「g」が設定されている場合:
matchは値があるときは配列arrayを返します。配列の各項目は、マッチするすべての文字列を順次表していますので、丸括弧にマッチするサブ文字列はなくなりました。配列にはindex属性とinput属性がありません。
execはグローバル表示の「g」がない表現と同じです。このときは配列array、array[0]が現在のマッチング文字列、array[1],array[2]…...が現在のマッチングの下の丸括弧にマッチする文字列を返します。この場合は、RegExpオブジェクトのlastIndex属性に注意して、元の文字列にマッチする文字列の最後の位置を表します。更なるマッチング結果がない場合は、lastIndex属性は0にセットされます。したがって、lastIndexのループを使用して、すべてのマッチ文字列を探し出すことができます。例を見てみます
js正規表現、pattern、注意事項
一言で言ってください。/\w+@\w+(\.+\w+){1,}/.test(str) を使って検証しないでください。「\@+\w+」(\.+\w+){1,}」.test(str)を使って検証しないでください。
後者を使って直接、add@dfddfで検証できます。
従来の正規表現の作成には、棒線で囲まれた文字の直接量が使用されます。しかし、パラメータの変化が要求される環境では、RegExp()構造関数はより良い選択である。
var reg1 = /'\w+'/g;
var reg2 = new RegExp('\'\\w+\'','g');
二つの作成方式を比較して、RegExpの最初のパラメータは作成する正則文字列である。一方、直接量の表示形式ではないので、スラッシュではなく、「/」で囲まれている。文字列では、引用符「\」と変換記号「\」を二次変換しなければなりません。また、直接量でもRegExp()コンストラクタでも、新たなRegExpオブジェクトが生成され、変数に値が与えられます。
「Javascript権威ガイド」では、正規表現の直接量について、ECMAscript 3は毎回同じRegExpオブジェクトに戻ると規定していますので、直接量で作成した正規表現の場合は一例を共有します。ECMAScript 5までは、毎回異なるインスタンスに戻ることを規定しています。
各ブラウザでは、IEは常にECMAScript 5の規定に従い、他のブラウザのより古いバージョンはECMAScript 3の規定に従う。したがって、実際のアプリケーションでは、構造関数を用いて作成する方法が安全です。または、lastIndex属性を使用するときは0に戻ります。
括弧()の使用:
1、グループ分け
個々の項目をサブ表現にまとめて処理する場合、一般的に?、+、*、{n,m}などの重複処理。例を見ます
var reg=/Java(script)/;
式ではscriptを一括処理する。
2、後方参照
すなわち、正規表現では「」(nは参照番号を表します)参照式の前の括弧で一致するテキストです。例を見ます
var reg = /(\d+)[a-z]{3}\1/;
//20man20
//20man23
//reg = /\1[a-z]{3}(\d+)/;
注意「」参照は、マッチする正規表現「\d+」ではなく、前の一致するテキスト「20」です。また、JSでは前のマッチテキストのみを参照してください。例のように、\1を括弧参照の前に書いても、テキストにはマッチしません。ブラウザでエラーが発生します。同じようにJSでもサポートされていません。name>exp)」(expは正則文字)の引用命名規則は、数字の参照のみをサポートします。グループと参照に言及した以上、グループ化だけを行いたいなら、参照したくないなら、利用できます。exp)「形式は、テキストにも参照番号にもマッチしません。例を見ます
var reg = /(\w{3})(?:\d+)([a-z]{2})\2/;
//man7788abab
明らかに\2マッチは「ab」であって、「7788」ではありません。このようにグループ化処理が容易であり、クエリの効率も向上している。3、サブモードマッチング
括弧のマッチングを直接参照したい場合がありますが、サブモードのマッチング機能(権威のあるガイドの中の発信子モードのマッチングは、やや違和感があります。実際には変数の形でマッチしたテキストを置換します)が使用できます。基本的な形式は'n'という形で一致番号nのテキストを置換し、Stringオブジェクト内のreplace()という方法がよく使われています。例を見て、2つの辺で単語を交換します。
var reg = /(\w+)=(\w+)/;
var str = ‘love=hate';
str.replace(reg,'$2=$1');
//"hate=love"
順序、欲張り、怠惰:一般的な重複マッチ文字は?、+、*、{n,m}はマッチングの過程において,貪欲整合の方法,すなわち結果文字にできるだけ多くマッチするようにした。これに対応するのは、怠け者のマッチングであり、できるだけ少ないマッチング結果となります。フォームを使ってマッチ文字を繰り返した後に疑問符を付けるだけです。よろしいです。n,m}ですか例を見ます
var str = 'goooogle‘;
var reg1 = /o+/; //"goooo"
var reg2 = /o+?/; //"go"
今は例を少し変えます。
var str = 'goooogle‘;
var reg1 = /o+gle/; //"oooogle"
var reg2 = /o+?gle/; //"oooogle"
改変後の例は結果が同じになりました。なぜ/o+?グーグル/「ogle」にマッチしていませんか?正規表現では常に左から右にマッチングし、右からサブストリングを取得してマッチングしませんでした。上の結果は同じですが、整合の原理は違います。reg 1では、まずo+がすべての「o」にマッチし、次に「Google」とマッチングして、全体のマッチングを完成させます。reg 2では、o+まず「o」にマッチしてから、文字列の2位から4位(つまり元の文字列の「ooo」)に失敗します。さらにo+第二の「o」にマッチして、成功したら、第三位から第四位まで「Google」にマッチします。これを類推します。最後に文字列全体にマッチします。
全体として覚えておきたいのですが、優先順位から言えば、左から右へ順番が合うようになります。
零幅は断言する:
ゼロ幅の断言の全体的な説明については、博文「正則表現30分入門教程」を参照してください。JSではゼロ幅だけが先行して断言されています。つまりゼロ幅正の予測が先行して断言します。exp)「ゼロとマイナス予測先行断言」(?!「exp」。
「ゼロ幅」とは、マッチした結果の文字に空間を占めないことです。例えば「\w"、\\s」は1つまたは複数の空間を占有し、マッチングされた文字の長さによって決定されます。このような対応する最初の最後の位置は空間を占有しないで、0の幅はこの種類に属します。
「プラス/マイナス予測」とは、断言の中で満足を求める場合をいう。「正」はexpを満足させるという意味で、「負」はexpを満足させないという意味です。
「先行」とは、マッチングされた文字列が前面にあることを指し、ゼロ幅は後に続くと断言します。つまり串の後の部分が満足しているかどうかは断言します。
「断言」とは判断の条件です。
二種の零幅が断言する例を見てください。
var str = 'java coffeescript';
var reg1 = /\b\w+(?=script\b)/; //coffee
var reg2 = /\b\w+(?!script\b)/; //java
reg 1は零幅正予測で先行断言します。script\b)「ある単語は「script」で終わる必要があります。それは一つの条件を表しています。空間の大きさは占有しません。同様に、ゼロ幅マイナス予測は先行して断言します。script\b)「scriptで終わらない単語を表します。
また、ゼロ幅がないので、ある文字列の前の部分がどのような条件を満たしているかは判断できません。しかし、JSでは複数の正規表現で実現できます。まず探している列にマッチしてから、先頭からindexまでの文字列を切り取り、後のサブストリングの末尾が必要な条件に合致しているかどうかを判定します。具体的な使い方は別に試してみてもいいです。
match()とexec()の異同:
matchとexecは正規表現とマッチする文字列の一般的な方法である。両者が実現する機能は似ていますが、細かい違いがあります。
1、使い方
matchは文字列の包装対象の方法で、使い方:String.match(RegExp);
execは正規表現オブジェクトの方法で、使い方:RegExp.exec(String);
2、戻りの結果
RegExpにグローバルフラグ「g」が設定されていない場合:
両者の戻りは同じだった。つまり、マッチング値がない場合はnullを返し、マッチング値がある場合は配列を返します。array[0]はマッチする文字列で、array[1]、array[2]......は正規表現の中の丸括弧にマッチするサブ文字列$1、$2に対応します。配列には2つの属性があり、array.indexはマッチング文字列の初期位置を表し、array.inputは検索中の文字列を表しています。
RegExpにグローバルフラグ「g」が設定されている場合:
matchは値があるときは配列arrayを返します。配列の各項目は、マッチするすべての文字列を順次表していますので、丸括弧にマッチするサブ文字列はなくなりました。配列にはindex属性とinput属性がありません。
execはグローバル表示の「g」がない表現と同じです。このときは配列array、array[0]が現在のマッチング文字列、array[1],array[2]…...が現在のマッチングの下の丸括弧にマッチする文字列を返します。この場合は、RegExpオブジェクトのlastIndex属性に注意して、元の文字列にマッチする文字列の最後の位置を表します。更なるマッチング結果がない場合は、lastIndex属性は0にセットされます。したがって、lastIndexのループを使用して、すべてのマッチ文字列を探し出すことができます。例を見てみます
var str = 'I love1 my job22';
var reg = /\b[a-z]+(\d+)\b/g;
array = str.match(reg);
//array = ["love1", "job22"]
//array.index = undefind
//array.input = undefined
------------------------------------
array = reg.exec(str);
//array = ["love1", "1"]
//array.index = 2
//array.input = "I love1 my job22"
//reg.lastIndex = 7
//run again
reg.exec(str);
//array = ["job22", "22"]
//array.index = 11
//array.input = "I love1 my job22"
//reg.lastIndex = 16
//run again
reg.exec(str);
//reg.lastIndex = 0
最後に、ECMAScript 3とECMAScript 5のバージョンの違いを考慮して、毎回マッチングが終わったら、手動でRegExpオブジェクトのlastIndex属性を0にセットして、古い非IEブラウザの要求を満たすようにします。js正規表現、pattern、注意事項
一言で言ってください。/\w+@\w+(\.+\w+){1,}/.test(str) を使って検証しないでください。「\@+\w+」(\.+\w+){1,}」.test(str)を使って検証しないでください。
後者を使って直接、add@dfddfで検証できます。