2017-02-23 21 views
0

何をいつ使うべきかを理解するために助けが必要です。 /x.*y//x(?=.*y)/の両方とも、文字列"sxcvgyb"の方法test()で使用した場合、同じ結果(true)を示しています。JavaScriptの正規表現: `/ x。* y /`対 `/ x(?=。* y)/`

+0

ブール値の結果(一致または不一致)をチェックしているだけの場合は、同等です。 – melpomene

+0

https://regex101.com/r/gisqMQ/1対https://regex101.com/r/nEEYZ6/1;右側の説明パネルを確認してください。 – Aaron

+1

あなたは答えを受け入れるべきです。 –

答えて

4

/x.*y//x(?=.*y)/は、testメソッドを使用しているときの目的と同じです。

後者はa regular expression "look-ahead" group (?=...)を使用しているため、一致すると技術的には.*yがキャプチャされませんが、一致が存在するかどうかだけを知る必要がある場合には認識できません。

TL; DR:短い正規表現、/x.*y/を選択してください。

// Identical when using `RegExp#test` 
 
console.log(/x.*y/ .test('xylophone')) //=> true 
 
console.log(/x(?=.*y)/.test('xylophone')) //=> true 
 

 
// Different when using `RegExp#exec` 
 
console.log(/x.*y/ .exec('xylophone')) //=> [ 'xy' ] 
 
console.log(/x(?=.*y)/.exec('xylophone')) //=> [ 'x' ]

1

もしtest方法で使用しているので、この結果は、この場合には同じであろう。

RegExp.prototype.test()

test()メソッドは、通常の 式と指定された文字列を返します。 trueまたはfalseを返します。

戻り

正規表現と 指定された文字列の間のマッチがある場合。 、false。

Refが:Developer Mozilla - RegExp.test()例えば

、ここで見てみましょう:

const str = "sxcvgyb" 
 

 
const test1 = RegExp(/x.*y/).test(str); 
 
const result1 = str.match(/x.*y/); 
 

 
const test2 = RegExp(/x(?=.*y)/).test(str); 
 
const result2 = str.match(/x(?=.*y)/); 
 

 
console.log('1st regex, is there a match? ', test1); 
 
console.log('1st regex, what was matched? ', result1); 
 
console.log('2nd regex, is there a match? ', test2); 
 
console.log('2nd regex, what was matched? ', result2);

人ともマッチ何かを、これtest結果が真です。しかし、実際に何が一致しているかを見れば、それらの違いを見ることができます。

これらの違いについてもう少し理解したいのであれば、@gyreの答えは "先読み"グループの説明には良いです。

また、@Aaronが提案されているので、regex101などのオンラインテスターを使用して、正規表現の機能を確認することをおすすめします。説明パネルをよく見て、それをよく理解してください。

関連する問題