非常简单的RegEx:查找出现但不是一种情况

时间:2013-05-30 09:00:55

标签: php regex regex-negation

嗨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 21g 15g 81 ...

我确信这很简单,但我无法让它发挥作用。

3 个答案:

答案 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

?>