0

次のような正規表現があります。

(\bee[0-9]{9}in\b)|(\bee[0-9]{9}[a-zA-Z]{2}\b)

入力文字列が のee123456789ab場合、 の 2 番目の部分が|文字列に一致します。しかし、入力文字列が文字列全体を消費するee123456789in最初の部分で|あり、2 番目の部分が文字列に一致するように変更されない場合は? の両方の部分が|文字列に一致するように変更して、両方の部分が文字列に一致したことを知りたいと思います。正規表現を使用してそれを行うことさえ可能ですか?

4

3 に答える 3

1

ORは、または何であっても、それを回避することはできません。
@Timが述べたように、先読みで行うことができます:

じっと立って、同じテキストを複数回見ることができます。

したがって、1 つの方法は、移動せずに各式を見ること
です。各式はオプションです。-

(?= ( ee [0-9]{9} in )? )
(?= ( ee [0-9]{9} [a-zA-Z]{3} )? )

最後の
式の後に位置は進みますが、文字間の位置が 1 つしか進まないため、これは良くありません。
また、グローバル コンテキストでの検索時にオーバーラップ も許可されます。

文字を消費することで検索を高速化できます -

(?= ( ee [0-9]{9} in )? )
(?= ( ee [0-9]{9} [a-zA-Z]{3} )? )
.

エンジンは、何かが消費されると最適化を行い
、チャンクで進みます (どのように決定するかは不明です)。

これらに他の式が含まれている場合は、
ここを過ぎて位置を進める必要があります。そうしないと、一致するものはありません。これにより、テキストの重複一致を排除することもでき
ます (それが目標である場合)。


1 つの式が他の式よりも長くなることが確実にわかっていない限り、オーバーラップを避けるのは実際には困難です。その場合は、条件付き
(利用可能な場合) をいつでも実行して、より大きなテキストを消費することができます -

(?= ( ee [0-9]{9} in )? )
(?= ( ee [0-9]{9} [a-zA-Z]{3} )? )
(?(2) \2 | \1 )

そして、一方が他方のサブセットであることがわかっている場合は、これを実行できます-

(?= ( ee [0-9]{9} in )? ) ( ee [0-9]{9} [a-zA-Z]{3} )


いずれにせよ、式によっては、オーバーラップを避けるために消費を正規表現に設計する際に多くの考慮が必要です。

于 2012-04-13T19:45:45.700 に答える
1

先読みアサーションを使用できます:

^(?=(ee[0-9]{9}in$)?)(?=(ee[0-9]{9}[a-zA-Z]{2}$)?)

\1これにより、 と の両方で一致がキャプチャされ\2ます。2 つのいずれかが空の場合、正規表現の対応する部分が一致していません。

部分文字列だけでなく文字列全体に対してテストしているため、単語境界アンカーを文字列アンカーの開始/終了に変更しました。

Python の場合:

>>> import re
>>> r = re.compile(r"^(?=(ee[0-9]{9}in$)?)(?=(ee[0-9]{9}[a-zA-Z]{2}$)?)")
>>> m = r.match("ee123456789ab")
>>> m.group(1)
>>> m.group(2)
'ee123456789ab'
>>> m = r.match("ee123456789in")
>>> m.group(1)
'ee123456789in'
>>> m.group(2)
'ee123456789in'

説明:

^               # Start of string
(?=             # Look ahead to see if it's possible to match...
 (              # and capture...
  ee[0-9]{9}in  # regex 1
  $             # (end of string)
 )?             # (make the match optional)
)               # End of lookahead
(?=             # Second lookahead, same idea...
 (
  ee[0-9]{9}[a-zA-Z]{2}
  $
 )?
)
于 2012-04-13T17:05:31.960 に答える
1

正規表現ではできません。その一部が一致すると、一致したと見なされます。2 つの異なる式で実行し、両方が成功したかどうかを確認する必要があります。

于 2012-04-13T16:53:27.930 に答える