正则表达式匹配子字符串,但不是从某些字符开始

时间:2015-09-15 11:50:44

标签: php regex perl

我正在搜索子字符串,例如test,在较长的字符串中,例如alongstringtest

在此示例中,它将匹配ok

但我想排除某些情况(当'test'以某些字符开头时)

e.g。

  

不匹配'a-test'(因为' - ')

     

与'abcgtest'不匹配(因为'g')

     

不匹配'abc“test'(因为'”')

我很长时间没有写过任何正则表达式,所以这让我把头发拉出来了!

2 个答案:

答案 0 :(得分:5)

使用negative lookbehind

(?<![-g"])test

答案 1 :(得分:2)

最简单的答案是

/(?<![g"-])test/

但如果您需要更高的性能,还有优化的空间。如果test无法出现在字符串的最开头,则以下是简单性和性能方面的明显优势:

/[^g"-]test/

否则,我会尝试以下方法:

/test(?<![g"-].{4})/s

/^test|[^g"-]test/

/^test/ || /[^g"-]test/

注意:-在字符类中具有特殊含义,但如果它是第一个字符,否定^之后的第一个字符或最后一个字符则不会。我总是最后使用它;它让事情变得简单明了。