66

私が持っているとしましょう

1 ABC Street
1 A ABC Street

の場合は1\dに一致し (予想どおり)、の場合は1 Aに一致します (予想)。パターンを組み合わせると、最初のパターンのみに一致し、2 番目のパターンは無視されます。\d \w\d|\d \w

私の質問は、この特定のケースで「または」条件を正しく使用する方法ですか?

PS: 条件は、その後に単一の文字がない場合にのみ数字をラップすることです。それ以外の場合は、数字と単一の文字をラップします。

例: 1 ABC Streetは番号 1 のみに一致しますが、1 A ABC Streetが1 Aをラップする場合

4

3 に答える 3

42

古典的な「または」は|. たとえばab|de、式の両側に一致します。

ただし、あなたのケースのようなもの?では、前の式と正確に 0 回または 1 回一致する量指定子を使用することをお勧めします (1 回が好ましい; つまり、「貪欲な」一致です)。別の (おそらくより信頼できる) 代替手段は、カスタム文字グループを使用することです。

\d+\s+[A-Z\s]+\s+[A-Z][A-Za-z]+

このパターンは次のように一致します。

  • \d+: 1 つ以上の数字。
  • \s+: 1 つ以上の空白。
  • [A-Z\s]+: 1 つ以上の大文字またはスペース文字
  • \s+: 1 つ以上の空白。
  • [A-Z][A-Za-z\s]+: 大文字の後に少なくとも 1 文字 (大文字または小文字) または空白が続きます。

より静的なチェックが必要な場合、たとえば実際に一致するABCandのみA ABCの場合は、(一致しない) グループを組み合わせて、内部で代替を定義できます (スコープを制限するため):

\d (?:ABC|A ABC) Street

または量指定子を使用した別の方法:

\d (?:A )?ABC Street
于 2013-04-13T09:22:53.747 に答える
18

私はあなたが必要とするのは単純かもしれないと思います:

\d( \w)?

\d \w|\dの代わりに のように記述されていれば、正規表現も機能することに注意してください\d|\d \w

これは、あなたの場合、正規表現が最初のオプションに一致する\dと、いわば新しい一致の検索を停止するためです。

于 2013-04-13T09:46:10.560 に答える