オルタネーションとは、正規表現における単純な「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…)を使用してください。