【JavaScript】正規表現の肯定先読みと肯定後読みで注意すること

  • このエントリーをはてなブックマークに追加

肯定先読み(Positive lookahead)と肯定後読み(Positive lookbehind)で注意すること。
次のような挙動をすることに注意する。



console.log("1:肯定先読み/Java(?=Script)w/");
//この正規表現は文字列「Java」の右側に文字列「Script」があることを表す。
//しかし、同時に肯定先読み(?=Script)はマッチしたら巻き戻り、文字列「Java」の右側に文字列「w」があることを表す。
//つまり、文字列「Java」の右側に文字列「Script」があり、かつ文字列「Java」の右側に文字列「w」があることになり、
//矛盾する文字列のパターンを表す正規表現になるため、この正規表現にマッチする文字列は存在しない。
let regex = /Java(?=Script)w/;

console.log("Javaw:"+regex.test("Javaw"));//false
console.log("Scriptw:"+regex.test("Scriptw"));//false
console.log("JavaScriptw:"+regex.test("JavaScriptw"));//false
console.log("TypeScriptw:"+regex.test("TypeScriptw"));//false
console.log("JavaWorldw:"+regex.test("JavaWorldw"));//false

/*

1:肯定先読み/Java(?=Script)w/
Javaw:false
Scriptw:false
JavaScriptw:false
TypeScriptw:false
JavaWorldw:false

*/

console.log("2:肯定後読み/w(?<=Java)Script/");
//この正規表現は文字列「Script」の左側に文字列「Java」があることを表す。
//しかし、同時に肯定後読み(?<=Script)はマッチしたら巻き戻り、文字列「Script」の左側に文字列「w」があることを表す。
//つまり、文字列「Script」の左側に文字列「Java」があり、かつ文字列「Script」の左側に文字列「w」があることになり、
//矛盾する文字列のパターンを表す正規表現になるため、この正規表現にマッチする文字列は存在しない。
regex = /w(?<=Java)Script/;

console.log("wJava:"+regex.test("wJava"));//false
console.log("wScript:"+regex.test("wScript"));//false
console.log("wJavaScript:"+regex.test("wJavaScript"));//false
console.log("wTypeScript:"+regex.test("wTypeScript"));//false
console.log("wJavaWorld:"+regex.test("wJavaWorld"));//false

/*

2:肯定後読み/w(?<=Java)Script/
wJava:false
wScript:false
wJavaScript:false
wTypeScript:false
wJavaWorld:false

*/



  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*