0

テキストに中かっこで囲まれた数字があります。つまり{123}、または{456ABC}。角かっこで囲まれていない数字もあります789。これらのまだラップされていない数値を一致させ、PHPのpreg_replaceを使用してポンド記号でラップしたいと思います#789#。数字は通常1〜3桁の範囲です。

print(preg_replace('/\d+/','#$0#',
'1) I can count to 2997510. You can only count to {456ABC}.'));

必要な出力:

#1#) I can count to #2997510#. You can only count to {456ABC}.

どの正規表現が数字と一致しますか?私はネガティブな先読み(?![^\{])\d+を試しました[^\{](\d+)[^\{]

4

2 に答える 2

1

[^\{\dA-F]([A-F\d]+)[^\}\dA-F]

(16進数と大文字を一致させようとしていると想定しています。一致しない場合は、文字クラスを適切に変更してください。)

余分な\d'は負の文字クラスにあります。存在しない場合、エンジンは最も外側の数字を切り取ってブラケットを回避するためです。たとえば[^\{](\d+)[^\}]、{34567}の456と一致します。

番号自体は、任意の一致の「グループ1」です。試合全体を数字にする必要がある場合は、先読みと後読みを使用します。

(?<=[^\{\dA-F])([A-F\d]+)(?=[^\}\dA-F])

#これは、先読みや後読みなしで'を挿入するためのPerlスタイルの検索と置換です。

s/([^\{\dA-F])([A-F\d]+)([^\}\dA-F])/$1#$2#$3/g

于 2013-01-10T22:11:24.083 に答える
0

(\A|[^{\d])(\d[\d\w]*)(\z|[^\}\d\z])あなたのためにそれをする必要があります。

次のように使用されます:

print(preg_replace('/(\A|[^{\d])(\d[\d\w]*)(\z|[^\}\d\z])/','$1#$2#$3',
'1) I can count to 2997510. You can only count to {456ABC}.'));

説明:

  • 最初の部分(\A|[^{\d])は、入力の先頭(文字列の先頭の数字をキャッチするため)または{数字以外の数字のいずれかに一致します。この部分は、数値がまだラップされていないことを確認します。

  • 2番目の部分(\d[\d\w]*)は、実際の数値の照合を行います。これは、数字で始まり、その後に任意の数の連続する数字または文字が続くものすべてに一致します。

  • 最後の部分(\z|[^\}\d\z])は、入力の終わりを探すことを除いて、最初の部分に類似しています。

  • この正規表現はターゲット番号の前後の文字をキャプチャできるため、1番目と3番目に一致するサブグループを使用してそれらの文字を追加し直すことが重要です(PHPの例を参照)。

于 2013-01-10T22:24:32.147 に答える