19

すべての 1 桁の数字のテキストを見つける必要があります。

私のコード:

$string = 'text 4 78 text 558 my.name@gmail.com 5 text 78998 text';
$pattern = '/ [\d]{1} /';

(結果: 4 と 5)

すべてが完璧に機能します。スペースを使用するのは正しいですか? 1桁の数字を区別する別の方法があるかもしれません。

ありがとう

4

5 に答える 5

26

まず、[\d]{1}と同等\dです。

あなたの質問については、後読み/先読みまたは単語境界 ( )のようなゼロ幅アサーションを使用することをお勧めし\bます。そうしないと、2 桁目の先頭のスペースが 1 桁目の末尾のスペースと一致するため、連続する 1 桁と一致しません (重複する一致は検出されません)。

これが私がこれを書く方法です:

(?<!\S)\d(?!\S)

これは、「数字の前に空白以外の文字がなく、その後に空白以外の文字がない場合にのみ数字に一致する」ことを意味します。

文字列の先頭または末尾にある 1 桁の数字にも一致するよう(?!\S)に、代わりに二重否定 like を使用しました。(?=\s)

あなたの例では、数字がスペースで囲まれている場合にのみ一致さ\b\d\bせたいように見えるので、これを好みます。\b\d\b45192.168.4.5

最後に句読点を許可するには、次を使用できます。

(?<!\S)\d(?![^\s.,?!])

数字の後に許可する任意の句読点文字を文字クラスに追加します (角括弧の内側ですが、 の後にあることを確認してください^)。

于 2013-02-26T21:03:55.737 に答える
18

単語境界を使用します。範囲量指定子{1}(単一\dは 1 桁のみに一致します) と文字クラス[]は、1 文字のみで構成されているため冗長であることに注意してください。

\b\d\b
于 2013-02-26T21:01:58.080 に答える
6

単語境界を検索します。

\b\d\b

他の人が説明したように、これは単一の数字を抽出します。つまり、「。」のように一部の特殊文字が尊重されない可能性があります。IPアドレスで。これに対処するには、FJ と Mike Brant の回答を参照してください。

于 2013-02-26T21:01:33.543 に答える
0

数字がどこに表示されるか、および数字が他の文字に隣接しているかどうか (.文末など) に大きく依存します。少なくとも、入力文字列の最初と最後に数字を取得できるように、単語境界を使用します。

$pattern = '/\b\d\b/';

しかし、次のように句読点を最後に考えることができます。

$pattern = '/\b\d(\b|\.|\?|\!)/';
于 2013-02-26T21:05:32.130 に答える