【问题标题】:Return every possible Regex result with, rather than just the first [duplicate]返回每个可能的正则表达式结果,而不仅仅是第一个 [重复]
【发布时间】: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


【解决方案1】:

我认为您可以使用抽象捕获组来执行此操作,将所有内容与另一个组包装在一起,如下所示:

^((.*?)( tom.*)?)$

Working demo

我知道这不是您想要的确切输出,但您可以拥有以下匹配内容:

MATCH 1
1.  [0-13]  `call tomorrow`
2.  [0-4]   `call`
3.  [4-13]  ` tomorrow`

以更好的图形方式,应该是:

作为旁注,我注意到您在明天之前有一个空白,也许您也喜欢这个正则表达式:

^((.*?) (tom.*)?)$

【讨论】:

    【解决方案2】:

    在这个简单的示例中,添加另一个捕获组,但您需要处理重复项。

    > re = /^((.*?)( tom.*)?)$/
    > console.log('call tomorrow'.match(re))
    ["call tomorrow", "call tomorrow", "call", " tomorrow", index: 0, input: "call tomorrow"]
    

    对于更复杂的情况,你需要自己编写一个循环。这些答案有一些好主意:

    【讨论】:

      最近更新 更多