2

嗨 Stackoverflowianers,

请帮我解决一个简单的正则表达式问题:

给定字符串(例如):

Hollg 21, Bergg 15, Rosenweg 81, Fernblickg 30

我想用“gasse”这个词替换所有出现的“g”,然后是一个空格和一个数字,但不是:如果正则表达式找到gin weg 81

我已经尝试过的:/[^(we)]g \d+/g

这个正则表达式效果很好,但它不仅需要,而且需要(results: )g之前的字母。我只需要, the和...glg 21, gg 15, kg 30g 21g 15g 81

我敢肯定这很简单,但我无法让它工作。

4

3 回答 3

3

为确保g前面没有we(which forms weg),您应该使用零宽度负向后看 (?<!pattern)

/(?<!we)g(?= \d)/

零宽度负向后查看将检查是否无法we在输入字符串中的当前位置之前找到。因为它只检查而不消耗文本,所以它是零宽度

我还修改了模式以包含一个零宽度的正向预读,它 在不消耗文本(?=pattern)的情况下检查空格和数字的存在,即它不会使文本与匹配部分内的模式匹配。这样,我们不必捕获数字并将其放回替换字符串中。(?=pattern)

总而言之,上面的正则表达式将检查 thatwe不是在前面gg后面是空格和一个数字。(好吧,没有必要检查一个或多个- 因为一个数字的存在无论如何都会满足一个或多个条件)。

然后您可以将替换代码编写为:

$replaced = preg_replace('/(?<!we)g(?= \d)/', 'gasse', $inputString);
于 2013-05-30T09:21:48.330 回答
1

你快到了,对你的正则表达式做一个小的修改,这应该对你有用

而不是使用正常的排除操作[^we],您需要使用否定的lookbehind来删除任何匹配的内容,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

于 2013-05-30T09:06:30.297 回答
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

?>
于 2013-05-30T09:22:56.417 回答