javascript 정규식(regexp, regular expression) "?!" 관련(Look ahead behind Positive Negative)

experience

  • runtime에 변경되는 특정 문자열이 포함되지 않는 정규식 작성하기 위해 찾아보니, javascript 정규식중에 ?! quantifier가 있는 것 확인.




 그런데, 문제는 ?!를 쓰는 경우, 특정 단어가 검색하려는 단어 뒤에 오지않게는 동작을 잘 하는데, 특정 단어가 검색하려는 단어 앞에 오지않게는 동작은 하지 않는다는 점...


ex> /a(?!b)/ 정규식으로 "ac"를 test하면 a가 잘 찾아짐(true).. "ab"인 경우는 못찾음(false)..


but, /(?!a)b/ 정규식으로 "ab"를 test하면 못찾아야 할 것 같지만, 잘찾음(true).. 






 확인해보니, 


 ?!는 Look Ahead negative로 뒤 따르는 부분 기준인 듯...


javascript에서는 Look Ahead positive(?=)과 Look Ahead negative만 지원 하는 듯...




관련 참고 내용(아래는 java기준)


---------------------------------------------------------
given the string foobarbarfoo


bar(?=bar)     finds the first bar (Find "bar" which has "bar" after it) . 
bar(?!bar)     finds the second bar (Fin "bar" which does not have a "bar" after it).
(?<=foo)bar    finds the first bar (Find "bar" which has "foo" before it).
(?<!foo)bar    finds the second bar (Fin "bar" which does not have "foo" before it).
you can also combine them


(?<=foo)bar(?=bar)    finds the first bar (Find "bar" with "foo" before it and "bar" after it).
Look ahead Positive(?=)
-----------------------------------------------------------


Find expression A where expression B follows


A(?=B)
Look ahead Negative(?!)


Find expression A where expression B does not follow


A(?!B)
Look behind Positive(?<=)


Find expression A where expression B precedes


(?<=B)A
Look behind Negative(?<!)


Find expression A where expression B does not precedes it


(?<!B)A
Atomic Groups (?>)


Atomic Groups are non-capturing and once a match is made will exit the atomic group and throw away all backtracks. Use Atomic Groups for optimising performance.


A non-atomic expression \b(foobar|foot|foo)\b and a test string of foots will:


match foo of foobar => fail and backtrack to the 2nd alternative
match foot of foot => fail as \b is exprected and backtrack to the 3rd alternative
match foo of foo => and fail to match.
An atomic group expression \b(?>foobar|foot|foo)\b and a test string of foots will:


match foot of foot => fail as expects /b but has s and exits group and releases all backtracking alternatives
Note: An atomic group \b(?>foobar|foot|foo|foots)\b will not match a test string of foots as it will test using the 2nd alternative and fail, releasing backtrackings.


A non-atomic group \b(foobar|foot|foo)\b will match a test string of foots as it tests each alternative.


Some resources
----------------------------------------------------
from : https://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups

댓글