1

正規表現、PCRE フレーバーで文字列を検証しています。オプションで 2 つの可能な場所のいずれかに表示できる部分文字列がありますが、両方には表示できません。そのための正規表現をどのように書くのですか?

部分文字列のない正規表現は

M[01]([ ]*\(?[A-Z]{3}\)?)?

部分文字列には正規表現 C[0-5] があり、括弧の前または後に来るか、まったく存在しない可能性があります。空白で区切ることも、区切らないこともできます。

有効な例 (すべて読みやすくするために空白を含みますが、空白を含まない同じものも有効です):

M1
M1 C1
M1 (OSS)
M1 C1 (OSS)
M1 (OSS) C1

無効な例:

M1 C1 (OSS) C1

私が思いついた最も近いものは

M[01]([ ]*C[1-5]?)([ ]*\(?[A-Z]{3}\)?)?([ ]*C[1-5]?)

ただし、これは無効な例も受け入れます。私は 2 つの位置しか持っていないので、もちろんさまざまな組み合わせを列挙できますが、より多くの可能な位置にうまくスケーリングできないため、そのソリューションは嫌いです。

それが重要な場合、これは検証される長い文字列に存在するグループであるため、正規表現はサブルーチンとしてより大きな文字列に埋め込まれます。

4

2 に答える 2