オルタネーションとは、正規表現における単純な「OR」を意味する用語です。
正規表現では、縦線文字|で表されます。
例えば、プログラミング言語HTML、PHP、Java、またはJavaScriptを見つけ出す必要があるとします。
対応する正規表現はhtml|php|java(script)?です。
使用例
let regexp = /html|php|css|java(script)?/gi;
let str = "First HTML appeared, then CSS, then JavaScript";
alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'
既に似たものを見てきました ― 角括弧です。これらは複数の文字の中から選択することを可能にし、例えばgr[ae]yはgrayまたはgreyにマッチします。
角括弧は文字または文字クラスのみを許容します。オルタネーションは任意の式を許容します。A|B|Cという正規表現は、式A、B、またはCのいずれかを意味します。
例えば
gr(a|e)yはgr[ae]yと全く同じ意味です。gra|eyはgraまたはeyを意味します。
パターンの一部のみにオルタネーションを適用するには、括弧で囲むことができます。
I love HTML|CSSはI love HTMLまたはCSSにマッチします。I love (HTML|CSS)はI love HTMLまたはI love CSSにマッチします。
例:時刻の正規表現
以前の記事では、hh:mm形式の時刻(例えば12:00)を検索するための正規表現を作成するタスクがありました。しかし、単純な\d\d:\d\dは曖昧すぎます。これは25:99を時刻として受け入れてしまいます(99分はパターンにマッチしますが、その時刻は無効です)。
より良いパターンをどのように作成できるでしょうか?
より注意深いマッチングを使用できます。まず、時間です。
- 最初の桁が
0または1の場合、次の桁は何でもかまいません。[01]\d。 - そうでない場合、最初の桁が
2の場合、次の桁は[0-3]でなければなりません。 - (他の最初の桁は許可されません)
オルタネーションを使用して正規表現の両方のバリアントを記述できます。[01]\d|2[0-3]。
次に、分は00から59でなければなりません。正規表現言語では、[0-5]\dとして記述できます。最初の桁は0-5、その後は任意の桁です。
時間と分を組み合わせると、パターンは[01]\d|2[0-3]:[0-5]\dになります。
ほぼ完成していますが、問題があります。|のオルタネーションが[01]\dと2[0-3]:[0-5]\dの間にあります。
つまり、分が2番目のオルタネーションバリアントに追加されています。これが明確な図です。
[01]\d | 2[0-3]:[0-5]\d
そのパターンは[01]\dまたは2[0-3]:[0-5]\dを探します。
しかし、これは間違っています。オルタネーションは正規表現の「時間」部分でのみ使用して、[01]\dまたは2[0-3]を許可する必要があります。「時間」を括弧で囲むことで修正しましょう。([01]\d|2[0-3]):[0-5]\d。
最終的な解決策
let regexp = /([01]\d|2[0-3]):[0-5]\d/g;
alert("00:00 10:10 23:59 25:99 1:2".match(regexp)); // 00:00,10:10,23:59
コメント
<code>タグを使用し、複数行の場合は<pre>タグで囲み、10行を超える場合はサンドボックス(plnkr、jsbin、codepen…)を使用してください。