如何编写JavaScript RegEx,以便它匹配例如单词cube
,但前提是单词small
在此单词之前的20个字符范围内不存在。
RegEx应匹配:
cube
red cube
wooden cube
small................cube
RegEx不匹配:
small cube
small red cube
small wooden cube
..........small......cube
any sphere
目前我的正则表达式看起来像这样:
> var regex = /(?:(?!small).){20}cube/im;
undefined
> regex.test("small................cube") // as expected
true
> regex.test("..........small......cube") // as expected
false
> regex.test("01234567890123456789cube") // as expected
true
> regex.test("0123456789012345678cube") // should be `true`
false
> regex.test("cube") // should be `true`
false
cube
前面必须有20个字符,其中每个字符不是small
的第一个字符。
但问题是:如果cube
出现在字符串的前20个字符内,则RegEx当然不匹配,因为cube
前面没有足够的字符。
如何修复RegEx,以防止这些误报?
答案 0 :(得分:2)
答案 1 :(得分:0)
我对此进行了调查,因为它似乎很容易,但我认为这肯定更难。
我的想法是尝试负面的后视正则表达式,如:
(?<!small).{0,20}cube
但这并没有起作用,当然javascript也不支持负面看法。
所以,我正在尝试一种不同的技术,它可以解决许多情况,如下所示:
cube -> match
red cube -> match
wooden cube -> match
small cube -> not matched
small red cube -> not matched
small wooden cube -> not matched
..........small......cube -> not matched
any sphere -> not matched
我们的想法是:
var newString = "cube" // <-- Change here the string your want to test
.replace(/(small)?.{0,20}cube/g, function ($0, $1) { return $1?$0:"[match]"; });
然后将newString
与[match]
进行比较。如果它不同,那么你的字符串就不匹配了。
我一直在努力解决一些应该匹配的案例,但是没有,例如:
small................cube
small.......cube
.
我知道这并不能完全回答您的问题,但我想与您分享这种方法,因为社区可以看到这一点,并帮助改进答案,或提供想法以提供更好的答案