我试图(但失败了)写一个正则表达式(PCRE 2),它将在特定单词(即·货车·,·VON·或·DE·)的第一个示例之后用破折号(-)替换每个空格,这些单词本身必须被空格包围。
举例来说:
HENRIETTA VON DER GRAAF
CAROLINE VAN OOSTEN DE WINKEL
MARC DE VRIES VAN JONG
ANNEKA VANHOVEN BAKKER
JOHN WILKINSON SMITH
字符串
将翻译为:
HENRIETTA VON-DER-GRAAF
CAROLINE VAN-OOSTEN-DE-WINKEL
MARC DE-VRIES-VAN-JONG
ANNEKA VANHOVEN BAKKER (NB: Does not match VAN as not surrounded by spaces)
JOHN WILKINSON SMITH (NB: No substitution here as pattern not matched)
型
这是我所得到的,但它并没有替换匹配之后的所有空格:
\b( VON| VAN| DE)+\s
型
https://regex101.com/r/s6BC1y/1
任何建议最赞赏!
4条答案
按热度按时间rjzwgtxy1#
这可以通过
\G
和\K
来实现:字符串
试试on regex101.com。
由于PCRE 2中缺乏对非固定宽度lookbehind的支持,我们无法执行以下操作,这可能更容易理解:
型
试试on regex101.com。
\G
匹配最后一个匹配项的末尾 * 或整个字符串的开头 *。由于(?!\A)
,只有当我们匹配第一个匹配项(?<!\S)(?:VON|VAN|DE)
时,后一个匹配项才会匹配。一个直观的解释:
a2mppw5e2#
您可以在没有正则表达式的情况下进行转换。
字符串
的数据
rseugnpd3#
你可以使用这个正则表达式来实现你想要的结果:
字符串
这匹配:
^(.*? (?:VAN|VON|DE))
:行首后的最小字符数,后跟一个空格,以及VON
、VAN
或DE
中的一个,所有字符都在第1组中捕获,然后是一个空格;或((?<!^)\G\w+)
:从最后一个成功匹配的末尾开始(但不是在字符串的开头,\G
通常允许这样),在第2组中捕获的一些单词字符,然后是一个空格然后,您可以使用
$1$2-
替换匹配项($1
或$2
中只有一个会有内容)。regex101上的正则表达式演示
请注意,正则表达式可以使用
\K
来简化,以丢弃匹配的第一部分,只匹配单词后面的空格:型
然后,替换为
-
。regex101上的正则表达式演示
xhv8bpkk4#
使用Perl:
字符串
型