我有以下字符串:
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
开始继续。
我希望这能稍微解释一下。
实际解决方案表达式
但是要解释实际的正则表达式,它是如何进行字符串解析的一个相当聪明的方法:
它首先有一个积极的前瞻(它不增加解析位置)来检查在当前解析位置是否有你正在寻找的一对:
(?=([^>]+>[^>]+))
- 如果先行匹配这样的一对,它会将其存储为匹配(因此内括号)
- 然后在前瞻之后,我们得到了单个字符串表达式
[^>]+>
,它不会作为匹配项存储(不在括号内),而是会注意单个字符串的解析过程字符串直到并包括下一个>
字符。 - 因为这个正则表达式是全局的,所以它然后开始重新进行匹配,但这次是从
>
字符之后的下一个字符位置开始,因为先前的解析已进行/增加/推进到它。
关于javascript - RegExp 是递归的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24865411/