Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匹配一个词而不是另一个词的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 匹配一个词而不是另一个词的正则表达式

Javascript 匹配一个词而不是另一个词的正则表达式,javascript,regex,Javascript,Regex,如何编写JavaScript正则表达式,使其与单词cube匹配,但前提是单词small不在该单词前面的20个字符范围内 正则表达式应匹配: cube 红色立方体 木立方体 small…………立方体 正则表达式不应匹配: 小立方体 小红色立方体 小木块 ……小……立方体 任何球体 目前我的正则表达式的外观和工作原理如下: >var regex=/(?:(?!small)。{20}cube/im; 未定义 >regex.test(“小立方体”)//如预期 真的 >regex.test(“……

如何编写JavaScript正则表达式,使其与单词
cube
匹配,但前提是单词
small
不在该单词前面的20个字符范围内

正则表达式应匹配:

  • cube
  • 红色立方体
  • 木立方体
  • small…………立方体
正则表达式不应匹配:

  • 小立方体
  • 小红色立方体
  • 小木块
  • ……小……立方体
  • 任何球体
目前我的正则表达式的外观和工作原理如下:

>var regex=/(?:(?!small)。{20}cube/im;
未定义
>regex.test(“小立方体”)//如预期
真的
>regex.test(“……小……立方体”)//如预期
假的
>regex.test(“01234567890123456789cube”)//如预期
真的
>regex.test(“0123456789012345678cube”)//应为“true”`
假的
>regex.test(“cube”)//应为'true`
假的
多维数据集前面必须有20个字符,其中每个字符都不是
small
的第一个字符。 但问题是:如果
cube
出现在字符串的前20个字符内,正则表达式当然不匹配,因为
cube
前面没有足够的字符


如何修复正则表达式以防止这些错误的否定?

我已经对此进行了调查,因为它似乎很容易,但确实比我想象的更难

我的想法是尝试一个反向查找正则表达式,如:

(?<!small).{0,20}cube
我们的想法是要做到以下几点:

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]"; });


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

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

.*?small.{0,15}cube|(.*?cube)
并使用匹配组#1进行匹配


你有两个选择:反转字符串和反转你的模式使用一个前瞻或看看这个也许这篇文章可以很有用,谢谢到目前为止!澄清一下:这个正则表达式应该可以作为其他正则表达式的一部分使用。倒车不是一种选择,因为那样的话,lookaheads就不起作用了。对于许多情况,使用可选的匹配组并查看它是否包含某些内容似乎是一个简单的解决方案,但只有当它不用作子正则表达式时才有效。如果可能的话,我更喜欢只使用正则表达式的解决方案。你能解释一下正则表达式引擎是如何与你的表达式相匹配的,或者你使用的技术吗?我真的很喜欢你的方法。实际上,这是一种简单的技术,可以绕过正则表达式引擎的功能,不允许可变长度查找。在这个正则表达式中,我们在左侧使用管道(或)构造匹配我们不需要的任何东西,最后使用捕获的组在管道中保留最右边的匹配。感谢您的想法。虽然我更喜欢一个没有额外步骤的解决方案,我必须再次“从外部”查看匹配的结果,但这似乎是一个非常简单的方法,可以工作。因此,在没有其他简单的正则表达式解决方案发布之前,这似乎是最好的解决方案。
.*?small.{0,15}cube|(.*?cube)