如何彻底替换所有正则表达式匹配项?
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。
是否可以编写一个正则表达式模式,以便彻底替换所有匹配项,而无需诉诸 运行 正则表达式倍数,或使用额外的库,如 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。