javascript - RegExp 是递归的

标签 javascript regex recursion

我有以下字符串:

string>string25>string89 > anotherString

我有以下正则表达式:

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

然后我希望我的正则表达式是递归的,从第一个字符开始到最后一个字符。我的语言是 Javascript,但我想看看我的 regExp 是否有这个能力?还是应该使用 while() 条件?我需要regExp本身的解决方案,如果不可能,请给出Javascript while() 本身的解决方案。

编辑:我想捕捉这个:

string>string25
string25>string89
string89 > anotherString

最佳答案

这与其说是递归,不如说是获取所有匹配项。在 Javascript 中,您必须使正则表达式全局

/([^>]+)/g

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

string
string25
string89  (including space at the end)

或者您可以轻松地使用 > 分隔符拆分您的字符串并收集个人:

yourString.split(">");

编辑

在你写下你想要的结果后,我建议你使用 @HamZa's solution使用积极的前瞻。你会得到一对。

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

一些解释

正则表达式从左到右遍历每个字符来解析字符串(以简化过程)。另一方面,积极的前瞻不会推进当前的解析位置,而是按照他们所说的去做:如果找到他们的表达式,他们就会向前看:

t(?=s) 将匹配 streets 中的第二个 t,因为它发现 s 紧随其后通过 t。但此匹配后的解析将从 t 开始继续。

我希望这能稍微解释一下。

实际解决方案表达式

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

  1. 它首先有一个积极的前瞻(它不增加解析位置)来检查在当前解析位置是否有你正在寻找的一对:

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

关于javascript - RegExp 是递归的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24865411/

相关文章:

javascript - React Router v4 <NavLink> 与 <Link> 的优点

javascript - 如何从 gsp 页面上的 javascript 调用 messages.property(参数化)值

javascript - 一个一个展示一个产品div

javascript - 在段落中添加行号

python - 如何按字符串中最后找到的数字拆分字符串?

php - Regex PHP 查找并匹配具有特定数据属性的 HTML 标签

正则表达式从字符串末尾开始搜索(反向)

algorithm - 找到复发: T(N) = 2 T(N/4 + √N) + (√10) N的解决方案

Java递归函数,值的单一初始化

sql - 递归 CTE 通过经理获取员工