【发布时间】:2026-02-04 22:55:01
【问题描述】:
我有一个如下所示的正则表达式:
/^(.*?)( tom.*)?$/
我在字符串上执行它
call tomorrow
我的匹配组将是
1. `call`
2. ` tomorrow`
但是,请注意,因为第二个匹配组是可选的,所以第一个通配符可能会占用整个字符串并且匹配仍然有效。如果您通过删除问号使第一个通配符变得贪婪,就会发生这种情况。
1. `call tomorrow`
所以我的问题是:有没有办法指示正则表达式引擎我希望 all 与字符串有效匹配,而不仅仅是第一个(基于懒惰/贪婪)?我承认这可能会很慢,但对我来说这是必要的。
为了澄清,我想解析字符串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),这将 也 em> 允许正则表达式的其余部分解析完成,并返回该结果。
请注意,这不是关于 /g/ 标志的问题 - 匹配的索引没有改变。
如果这是不可能的,那么 Regex 是不是该应用程序的错误工具?我应该改用什么?
【问题讨论】:
-
很难说你在寻找什么结果。一个例子(比如说,你想要的匹配列表)会很有帮助。
-
添加说明
-
如果我理解正确,您需要某种正则表达式标记器。 Tokenizer 将基于另一个 (!) regexp 表达式的 regexp 表达式分解为可以单独匹配的组(它根据组、OR 等解构 regexp)。我记得,Robin Herbots 为他的输入掩码 (github.com/RobinHerbots/jquery.inputmask/blob/3.x/js/…) 做了类似的 jquery 扩展。您可以尝试从他的实现(MIT 许可证)中提取“analyzeRegex”和“validateRegexToken”并根据您的需要进行定制。
-
sp00m 的链接将我指向正确的位置。答案是“不自己编写代码是不可能的”。我想了很多,但得到确认是件好事。如果有人将其作为答案发布,我会接受。
标签: javascript regex