如何彻底替换所有正则表达式匹配项?

How to exhaustively replace all regex matches?

是否可以编写一个正则表达式模式,以便彻底替换所有匹配项,而无需诉诸 运行 正则表达式倍数,或使用额外的库,如 Perl 的 Regexp::Exhaustive、Ruby的string.scan(/regex/)等(语言对本题不重要)?

例如,假设我需要用 \-/ 替换破折号 - 以允许在 LaTeX 文档中对复合词进行正确的连字。

到目前为止我的正则表达式是 (PCRE):

s/(\w+)-(\w+)/\-\//ig;

在这个公认的人工示例中,它只会替换第一个破折号。

six-nation-golden-cup-award

会变成

six\-/nation-golden-cup-award

是否有更好的正则表达式让它替换所有出现的事件,以便得到:

six\-/nation\-/golden\-/cup\-/award

您当前的正则表达式过于复杂,它匹配破折号周围的整个字符串。我会这样做:

\b-\b

Regex101 demo with substitution

\b表示"word-boundary",所以它要求一个词从那里开始或结束。您可以从 Regex101 link 中看到并非每个破折号都匹配。在正则表达式中,"word" 字符包括数字和下划线 _,因此可以找到像 4-_ 这样的字符串并将其替换为 4\-/_.

如果你自己做 lookbehind and lookahead manually, you can define the character classes。所以这个:

(?<=[a-z])-(?=[a-z])

要求 preceding/following 字符只能是字母,不需要 numbers/underscores。

Regex101 demo