RegEx匹配不成功的另一个单词

时间:2014-07-15 14:38:08

标签: javascript regex

如何编写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,以防止这些误报?

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式:

.*?small.{0,15}cube|(.*?cube)

并使用匹配的组#1进行比赛。

Online Regex Demo

答案 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

.

有问题

我知道这并不能完全回答您的问题,但我想与您分享这种方法,因为社区可以看到这一点,并帮助改进答案,或提供想法以提供更好的答案