我有一个看起来像这样的正则表达式:
/^(.*?)( tom.*)?$/
我在字符串
上执行它call tomorrow
我的匹配组将是
1. `call`
2. ` tomorrow`
但是,请注意,因为第二个匹配组是可选的,所以第一个通配符可以使用整个字符串,并且匹配仍然有效。如果您通过删除问号使第一个通配符贪婪,就会发生这种情况。
1. `call tomorrow`
所以我的问题是:有没有办法指示正则表达式引擎我希望所有有效匹配字符串,而不仅仅是第一个(基于懒惰/贪婪)?我承认这可能很慢,但对我的情况来说这是必要的。
为了澄清,我想解析字符串call tomorrow
并让它返回:
MATCH 1
1. `call`
2. ` tomorrow`
MATCH 2
1. `call tomorrow`
当Regex引擎遇到(.*?)
时,它将消耗0个字符,然后尝试其余的字符串。当失败时,它会尝试1个字符,然后是2个,然后是3个,然后是4.当它击中4个字符时,(call
)正则表达式会解析到最后,然后退出。我想要一种说法再次解析的方法,但是从那个消耗5个字符的通配符开始,然后是6,然后是7 ......"最终,它将尝试消耗13个字符(call tomorrow
),这将还允许正则表达式的其余部分解析完成,并返回该结果。
请注意,这不是关于/g/
标志的问题 - 匹配的索引没有变化。
如果无法做到这一点,Regex是否适用于此应用程序?我该怎么用呢?
答案 0 :(得分:0)
我认为你可以用一个抽象的捕获组来做这个,用另一个组包装所有这些,如下所示:
^((.*?)( tom.*)?)$
<强> Working demo 强>
我知道这不是您想要的确切输出,但您可以拥有此匹配内容:
MATCH 1
1. [0-13] `call tomorrow`
2. [0-4] `call`
3. [4-13] ` tomorrow`
以更好的图形方式,它将是:
作为旁注,我注意到你明天之前有空白也许你也喜欢这个正则表达式:
^((.*?) (tom.*)?)$
答案 1 :(得分:0)
在这个简单的示例中,添加另一个捕获组,但您需要处理重复项。
> re = /^((.*?)( tom.*)?)$/
> console.log('call tomorrow'.match(re))
["call tomorrow", "call tomorrow", "call", " tomorrow", index: 0, input: "call tomorrow"]
对于更复杂的情况,您需要自己编写一个循环。这些答案有一些好主意: