RegEx是递归的

时间:2014-07-21 12:44:02

标签: javascript regex recursion

我有以下字符串:

string>string25>string89 > anotherString

我有以下regExp:

^[\w\_\-\.\d]+(?:\s*)?(?:\>)+(?:\s*)[\w\_\-\.\d]*

然后我希望我的regExp是递归的,从第一个字符开始到最后一个字符。我的语言是Javascript,但我想看看我的regExp是否具备此功能?或者我应该使用while()条件?我需要一个regExp本身的解决方案,如果不可能,那么请给出Javascript while()本身的解决方案。

编辑:我想抓住这个:

string>string25
string25>string89
string89 > anotherString

1 个答案:

答案 0 :(得分:2)

这与递归所有匹配的关系不大。在Javascript中,您必须使用正则表达式全局

/([^>]+)/g

这将匹配字符串中的所有子字符串:

string
string25
string89  (including space at the end)

或者您可以轻松地将您的字符串与>分隔符分开并收集个人:

yourString.split(">");

修改

在您写完所需结果后,我建议您选择使用正面前瞻的@HamZa's solution。然后你就会回来了。

/(?=([^>]+>[^>]+))[^>]+>/g

一些解释

正则表达式从左到右解析字符串迭代每个字符(以简化过程)。另一方面,积极的前瞻不会进展当前的解析位置,而是按照他们的说法行事:如果发现他们的表达,他们会前瞻:

t(?=s)将匹配t中的第二个streets,因为它会看到s后跟t。但是,此匹配后的解析将从t开始继续。

我希望这能解释一下。

实际解决方案表达式

但是为了解释实际的正则表达式,它是一个相当聪明的方法,它如何进行字符串解析:

  1. 它首先具有正向前瞻(它不会增加解析位置)以检查当前解析位置是否有您正在寻找的对:

    (?=([^>]+>[^>]+))
    
  2. 如果先行者匹配这样一对,则将其存储为匹配(因此是内括号)
  3. 然后在前瞻之后,我们有单个字符串表达式[^>]+>,它不会被存储为匹配项(不在括号内),而是要注意解析单个字符串的进程,包括下一个>字符。
  4. 因为这个正则表达式是全局的,所以它会再次开始匹配,但这次是从>字符后面的下一个字符位置开始,先前的解析进行/递增/前进到它。