4

次の2つの正規表現を1つにまとめたいと思います。

  • ^([A-Z]{1,2}) ?([0-9]{1,4})$例:AB 1234
  • ^([0-9]{1,4}) ?([A-Z]{1,2})$例:1234 AB

私はこれが次のように単純だと思いました:

^([A-Z]{1,2}) ?([0-9]{1,4})|([0-9]{1,4}) ?([A-Z]{1,2})$

ただし、上記は常に4つのグループを返します。

  1. ''
  2. ''
  3. '1234'
  4. 'AB'

常に2つのグループを返すように、これら2つの正規表現を組み合わせるにはどうすればよいですか?例えば

  1. '1234'
  2. 'AB'

また

  1. 'AB'
  2. '1234'
4

1 に答える 1

3

^まず、最初の選択肢にのみ適用され、2番目の選択肢にのみ適用されるため、組み合わせは完全には正しくありません$。したがって、交代をグループ化する必要があります。

^(?:([A-Z]{1,2}) ?([0-9]{1,4})|([0-9]{1,4}) ?([A-Z]{1,2}))$

現在、達成したいことはすべての正規表現エンジンで実行できるわけではありませんが、一部(PCREなど)は、キャプチャグループがすべての代替に対して個別にカウントされる特別な代替構造をサポートしています。構文は次のとおりです。

^(?|([A-Z]{1,2}) ?([0-9]{1,4})|([0-9]{1,4}) ?([A-Z]{1,2}))$

編集:

残念ながら、これは特にPythonではサポートされていません。名前付きキャプチャグループを再利用する方法もありません。match.groups()したがって、おそらく2つの正規表現から空の文字列を除外するか、それに固執する必要があります。

于 2012-12-06T16:06:35.810 に答える