嗨Stackoverflowianers,
请帮我解决一个简单的正则表达式问题:
给定字符串(例如):
Hollg 21, Bergg 15, Rosenweg 81, Fernblickg 30
我想替换所有出现的“g”后跟一个空格和一个带有“gasse”字样的数字但是:如果正则表达式在g
中找到weg 81
。
我已尝试过的内容:/[^(we)]g \d+/g
此正则表达式运行良好但不仅需要g
,还需要g
之前的字母(结果:lg 21, gg 15, kg 30
)。我只需要g 21
,g 15
和g 81
...
我确信这很简单,但我无法让它发挥作用。
答案 0 :(得分:3)
要确保g
前面没有we
(形成weg
),您应该使用零宽度负面后视 {{ 1}}:
(?<!pattern)
零宽度负后视将检查在输入字符串中当前位置之前是否无法找到/(?<!we)g(?= \d)/
。由于它仅在不消耗文本的情况下进行检查,因此零宽度。
我还修改了模式以包含零宽度正向预测 we
,用于检查是否存在空格和数字而不消耗文字,即它不会使文本与匹配的(?=pattern)
部分内的模式匹配。这样,我们就不必捕获数字并将其放回替换字符串中。
总结一下,上面的正则表达式会检查(?=pattern)
不在we
之前,而g
后面跟空格和数字。 (好吧,没有必要检查一个或多个 - 因为一个数字的存在无论如何都会满足一个或多个条件。)
然后您可以将替换代码写为:
g
答案 1 :(得分:1)
你几乎就在那里,对你的正则表达式进行了一些小改动,这应该适合你
您需要使用负面的lookbehind来删除与[^we]
匹配的内容,而不是we
之后的g
,而不是使用正常的排除操作e
。 (见我和nhahtdh之间的评论)
<?php
$regex = '/(?<!we)g (\d+)/';
$input = 'Hollg 21, Bergg 15, Rosenweg 81, Fernblickg 30, weg 81';
$output = preg_replace($regex, 'gasse $1', $input);
//output = Holgasse 21, Bergasse 15, Rosenweg 81, Fernblicgasse 30, weg 81
您需要将正则表达式中的数字分组,然后在替换中使用对它的引用,即$1
答案 2 :(得分:0)
请尝试使用此表达式:
<?php
$expression = '/(?<!we)g\s(\d+)/';
$input = 'Hollg 21, Bergg 15, Rosenweg 81, Fernblickg 30, weg 81, ceg 45';
$output = preg_replace($expression, 'gasse $1', $input);
//output = Holgasse 21, Bergasse 15, Rosenweg 81, Fernblicgasse 30, weg 81, cegasse 45
?>