Regex匹配子字符串,但不以某些字符开头


regex to match a substring, but not starting with certain characters

我正在寻找一个子字符串,例如test,在一个较长的字符串,例如alongstringtest

在这个例子中,它将匹配ok

但是我想排除某些情况(当'test'前面有某些字符时)

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

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

不匹配'abc"test'(因为'"')

我很长时间没有写任何正则表达式了,所以这让我有点抓狂!

使用negative lookbehind:

(?<![-g"])test

最简单的答案是

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

但是如果你需要更多的性能,还有优化的空间。如果test不能出现在字符串的最开始,那么从简单性和性能的角度来看,下面是一个明显的赢家:

/[^g"-]test/

否则,我会尝试以下操作:

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

注意:-可以在字符类中具有特殊含义,但如果它是第一个字符,否定^后的第一个字符或最后一个字符则不具有特殊含义。我总是最后使用它;