次のように実行できます。
[ab] [xy]|[xy] [ab]|[abxy]
ここには 3 つの選択肢があります。
a
、、、b
(1文字x
)のみy
- または 2 文字、
a
または またはのb
前に来て、間にスペースを入れます。x
y
- または 2 文字、
x
または またはのy
前に来て、間にスペースを入れます。a
b
[abxy]
念のため、検索すると、単一のものを検索する前に、前のもの(ペアになっているもの)が検索されます。正規表現を使用して検索する場合は順序が重要ですが、検証を行う場合はそれほど重要ではありません。
それを書く別の方法:
[ab]( [xy])?|[xy]( [ab])?
これは文字に対してのみ機能しますが、文字列に対して機能させることができます。たとえば、4 つの文字列s1
, s2
, s3
,があるとしs4
ます。
(s1|s2)( (s3|s4))?|(s3|s4)( (s1|s2))?
以下を検索します。
- or のいずれ
s1
かs2
、かもしれないし、そうでないかもしれません (の 0 または 1 つのインスタンス) の後にs3
orが続きますs4
- (逆に)
s1
これは、s2
、 など (単一の文字列) 、s2 s3
、s3 s2
など (ペアで、順序を逆にすることができます)のすべてのケースをカバーします。上記の正規表現は、量指定子のデフォルトの貪欲なプロパティにより、単一の文字列に頼る前に長いバージョン (ペアになっている) を検索します。
上記の正規表現でキャプチャ グループ を使用していることに注意してください。これにより、内部(pattern)
に一致する文字列の位置が記録されます。パターンに一致するテキストを参照する必要がない場合は、pattern
非キャプチャ グループにすることができます。(?:pattern)
これにより、いくつかのクロック サイクルが節約されます。
(?:s1|s2)(?: (?:s3|s4))?|(?:s3|s4)(?: (?:s1|s2))?
(他の正規表現のキャプチャ グループを非キャプチャ グループに変更するタスクは、演習として残します。追加するのと同じくらい簡単です)?:
検索または検証?
そのようなパターンを見つけたい場合は、上記の正規表現が機能するはずです。
文字列がパターンに一致することを検証する場合は、アンカー^
(文字列の先頭に一致)、$
(文字列の末尾に一致) を使用して、文字列が正確な形式に従っていることを確認する必要があります。
^([ab] [xy]|[xy] [ab]|[abxy])$
^([ab]( [xy])?|[xy]( [ab])?)$
^((s1|s2)( (s3|s4))?|(s3|s4)( (s1|s2))?)$
^(?:(?:s1|s2)(?: (?:s3|s4))?|(?:s3|s4)(?: (?:s1|s2))?)$
上記のセクションの正規表現を()
( capture groupで囲んでいますが、実際にはここでグループ化するだけで済みます)。これは、自分の|
中に交代があるからです。
拡張性と制限
必要に応じて、最初のグループまたは 2 番目のグループにさらに文字列を追加できます。
^([abcd]( [xyz])?|[xyz]( [abcd])?)$
ただし、グループの数を増やしたい場合は、正規表現を使用するのではなく、文字列をスペースで分割し、トークンをループしてグループの順列を見つけることをお勧めします。