【问题标题】:Solving regular expression recursive strings解决正则表达式递归字符串
【发布时间】:2012-12-15 13:20:57
【问题描述】:

问题

我可以匹配这个字符串

(xx)

使用这个正则表达式

\([^()]*\)

但它不会匹配

(x(xx)x)

所以,这个正则表达式会

\([^()]*\([^()]*\)[^()]*\)

但是,这将无法匹配

(x(x(xx)x)x)

但同样,这个新的正则表达式会

[^()]*\([^()]*\([^()]*\)[^()]*\)[^()]*

这是您可以注意到复制的地方,第二个正则表达式在第一个 \( 之后和最后一个 \) 之前的整个正则表达式模式被复制并替换了最中心的 [^()]*。当然,最后一个正则表达式不匹配

(x(x(x(xx)x)x)x)

但是,您始终可以像我们对上一个正则表达式所做的那样,将大多数[^()]* 替换为[^()]*\([^()]*\)[^()]* 的中心,它将捕获更多(xx) 组。添加到正则表达式中的越多,它可以处理的越多,但它始终会受到您添加的数量的限制。

那么,你如何绕过这个限制并捕获一组括号(或任何两个字符),其中可以包含额外的组?

错误假设的解决方案

我知道你可能会认为只是使用

\(.*\)

但这将匹配所有

(xx)xx)

它应该只匹配子字符串(xx)

这个

\([^)]*\)

不会匹配嵌套类似的括号对

(xx(xx)xx)

从这里,它只会匹配到(xx(xx)

有可能吗?

那么是否可以编写一个可以匹配括号组的正则表达式?或者这是必须通过例程处理的事情?

编辑

解决方案必须在正则表达式的 JavaScript 实现中起作用

【问题讨论】:

  • 所以你希望括号两边平衡..right
  • 正确。还要注意编辑。
  • 有些问题不是针对正则表达式的。使用一个简单的状态机,一次遍历字符串一个字符。
  • @Sam:不,JS 正则表达式不能完成这个任务。只需使用堆栈正常解析字符串即可。
  • 任何链接到使用基于 JS 的状态机递归解析字符串的示例?我正在努力寻找任何东西。

标签: javascript regex recursion


【解决方案1】:

如果您只想在圆括号平衡的情况下进行匹配,您无法通过 regex 本身进行匹配..

更好的方法是

1>使用\(.*\)匹配字符串

2>计算(,) 的数量并检查它们是否相等..如果它们相等,那么你就有了匹配

3>如果它们不相等,请使用\([^()]*\) 匹配所需的字符串

【讨论】:

  • 是的,我会考虑这样的事情。不过要小心! () 数量相同是不够的!例如,考虑:)(( ) ) ( ( )
【解决方案2】:

正式地说,这不可能使用正则表达式!正则表达式定义regular languages,正则语言不能有平衡括号。

然而,事实证明这是人们一直需要做的事情,因此许多正则表达式引擎已被扩展为包含正式正则表达式之外的更多内容。因此,您可以在 javascript 中使用正则表达式来做平衡括号。本文可能会帮助您入门:http://weblogs.asp.net/whaggard/archive/2005/02/20/377025.aspx。它适用于 .net,但同样适用于标准 javascript 正则表达式引擎。

但就个人而言,我认为最好使用您自己的函数来解决此类复杂问题,而不是利用正则表达式引擎的扩展功能。

【讨论】:

  • “它适用于 .net,但同样适用于标准的 javascript 正则表达式引擎。” 不,JavaScript 的正则表达式不支持本文中使用的功能。
猜你喜欢
  • 2020-06-04
  • 2023-03-14
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2016-04-29
  • 2012-08-07
相关资源
最近更新 更多