【问题标题】:Regex Error: Nothing to Repeat正则表达式错误:无需重复
【发布时间】:2014-06-12 03:18:57
【问题描述】:

我是 JavaScript 正则表达式的新手,我无法让正则表达式工作。错误是:

未捕获的 SyntaxError:无效的正则表达式:/(.*+x.*+)\=(.++)/:无需重复

我知道除此之外还有很多类似的问题,但我无法根据其他人的回答和建议来解决这个问题。

正则表达式是:

/(.*+x.*+)\=(.++)/

它用于匹配一侧带有变量x的简单方程。

它应该匹配的表达式的一些示例是(我正在编写一个简单的程序来求解变量x):

  • 240x=70

  • x+70=23

  • 520/x=2

  • 13989203890189038902890389018930.23123213281903890128390x+23123/2=3

我正在尝试所有格量词(*+),因为之前的表达式很贪心,导致浏览器崩溃,但现在出现了这个我没有遇到过的错误。

我确信这与逃避无关,这是许多其他人的问题。

【问题讨论】:

  • .*+ 没有意义...您希望它代表什么?您可能只需要.*(表示任意字符中的一个或多个)。
  • @jahroy 你知道我是故意的,对吧?作为所有格量词(*+)而不是贪婪量词(*)?还是我用错了?
  • 重新阅读后,您似乎是故意这样做的,但做得并不正确;-)
  • @jahroy 我做错了什么?
  • 你的意思是这样的? regex101

标签: javascript regex


【解决方案1】:

您可以使用 javascript 模拟 possessive quantifier(因为您可以模拟 atomic group 也是一样的):

a++ => (?>a+) => (?=(a+))\1

这个技巧利用了这样一个事实:一旦正则表达式引擎到达右括号,lookahead assertion (?=...) 的内容就会变成原子的。如果你在里面放了一个捕获组(你想是原子的或占有的),你只需要在捕获组之后添加一个backreference\1

关于你的模式:

.*+x 总是错误的断言(如.*+=):因为.* 是贪婪的,它会匹配所有可能的字符,如果你让它拥有所有格.*+,正则表达式引擎不能回溯匹配“x”之后。

你可以做什么:

我建议不要使用模糊的.*,而是更明确地描述可以包含每个捕获组的内容。我认为您不需要所有格量词来完成这项任务。

尝试在运算符上拆分字符串也是一个好主意,并且避免构建过于复杂的模式。

【讨论】:

  • @Jon:尝试将aaaaaaaba+ab(?=(a+))\1ab 匹配。第一种模式允许正则表达式引擎回溯,但第二种不允许。
  • ?= 有什么作用?我认为原子组只以?> 开头。正则表达式之后的\1 是什么?抱歉,我是正则表达式的新手。
  • 我尝试使用以下正则表达式:/(?=(.*x.*))\=(?=(.+))/i 但它不匹配任何内容。
  • @Jon:要很好地理解该模式,您需要熟悉几个正则表达式概念,尤其是回溯机制(这是所有的关键)。对于每个引用的概念,我在答案中添加了几个链接。但我建议先阅读(在同一站点上)关于惰性和贪婪量词的页面,然后是所有格量词和原子组(不要本末倒置)。但是,正如我在帖子末尾所写的那样,您要完成的任务不需要所有格量词。
【解决方案2】:

Javascript 正则表达式不支持所有格量​​词。你应该尝试不情愿(非贪婪)的:*?+?

【讨论】:

    【解决方案3】:

    试试这个,它会分开左手边和右手边:

    (.*x.*)=(.+)
    

    Live demo

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 1970-01-01
      • 2014-03-19
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      相关资源
      最近更新 更多