2016-06-19 10 views

答えて

4

最初のものは、正の先読みが言って、だけ主張である「数字が続くゼロ以上の文字がなければなりません。」少なくとも1桁の数字を含む文字列と照合すると、アサーションが真であるかどうかがわかりますが、一致するテキストは空の文字列になります。

2番目のものは、「数字が必要です」という一致の後にアサーション(肯定先読み)で一致するものを検索します。一致するテキストは、文字列内の最後の数字の前の文字(前の数字も含めて、.*は貪欲なので、最後の数字がアサーションによって必要とされるため、最後の数字まで消費されます)。

注マッチオブジェクトの結果の違い:

var str = "foo42"; 
 
test("rex1", /(?=.*\d)/, str); 
 
test("rex2", /.*(?=\d)/, str); 
 

 
function test(label, rex, str) { 
 
    console.log(label, "test result:", rex.test(str)); 
 
    console.log(label, "match object:", rex.exec(str)); 
 
}

出力(スニペットを実行することができない人のための):どのように試合結果

 
rex1 test result: true 
rex1 match object: [ 
    "" 
] 
rex2 test result: true 
rex2 match object: [ 
    "foo4" 
] 

お知らせ2番目のケースではfoo4(文字列foo42)ですが、最初のケースでは空白です。 。

0

詳細

で 以下の違いを見つけてください*(改行を除く)任意の文字に一致する意味
(?= \ d)は肯定先読みを意味します - 以下の正規表現はDの試合\ を一致させることができることをアサート数字[0-9]

(= * \ dは?。)

CapturingGroup 

MatchOnlyIfFollowedBy
シーケンス:試合順
で以下のすべての 繰り返し
AnyCharacterExcept \ nは
0回以上

*(= \ dは?)

シーケンス:。ために、以下のすべてに一致
繰り返し
AnyCharacterExcept \ nは
0回以上
CapturingGroup
MatchOnlyIfFollowedBy
数字

+0

参照用に正規表現パーサ/デコーダを少し見つけてください http://www.myezapp.com/apps/dev/regexp/show.ws https://regex101.com/ –

1

(?=...)は、positive lookaheadです。これらの式はどちらも "任意のテキストの後ろに数字"と一致します。しかし、違いは、(?=...)は、一致する文字を「食べる」(「キャプチャ」しない)ということです。実際の目的のために、これがあなたの正規表現に含まれる唯一のものなら、同じものにマッチします。しかし、.*(?=\d)は、あなたが質問に入れたものより多くのものがない限り、より正確な表現になります。あなたはキャプチャグループか、正規表現を実行した後にマッチしたテキストの内容を使用している使用しているとき

それは本当に重要です:

あなたは番号の前にすべてのテキストをキャプチャしたい場合

(.*?(?=\d)) 

?はマッチが非貪欲になり、それが唯一の最初の数まで一致します:ではなく、番号自体、そして後にそれを使用する、あなたはこれを行うことができます。数字に至るすべてのテキストは、最初のグループと一致する結果になります。

関連する問題