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