正規表現、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 つの位置しか持っていないので、もちろんさまざまな組み合わせを列挙できますが、より多くの可能な位置にうまくスケーリングできないため、そのソリューションは嫌いです。
それが重要な場合、これは検証される長い文字列に存在するグループであるため、正規表現はサブルーチンとしてより大きな文字列に埋め込まれます。