2

Stackoverflowianers さん、こんにちは。

簡単な正規表現の問題を解決するのを手伝ってください:

指定された文字列 (例):

Hollg 21, Bergg 15, Rosenweg 81, Fernblickg 30

「g」の後に空のスペースと数字が続くすべての出現箇所を「gasse」という単語に置き換えたいのですが、そうではありませgweg 81

私がすでに試したこと:/[^(we)]g \d+/g

この正規表現はうまく機能しますが、 (results: )gの前の文字だけでなく、文字も必要です。、、だけが必要です ...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)

要約すると、上記の正規表現weは が先行しておらずggその後にスペースと数字が続くことを確認します。(ええと、 1 つ以上をチェックする必要はありません。数字が1 つあれば 1 つ以上の条件が満たされるためです)。

次に、置換コードを次のように記述できます。

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

あなたはほとんどそこにいました.正規表現に小さな変更を加えました.これはあなたのために働くはずです.

通常の除外操作[^we]を使用するのではなく、否定的な後読みを使用して、単に続く anweではなく、一致するものをすべて削除する必要があります。(私と nhahtdh の間のコメントを参照してください)ge

<?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 に答える