論理和指定子は、実際には単純な “OR” である正規表現の用語です。
正規表現では、縦線の文字 | で表現されます。
例えば、プログラム言語を探す必要があるとします: HTML, PHP, Java, または JavaScript です。
対応する正規表現は次の通りです: html|php|java(script)?.
利用例:
let reg = /html|php|css|java(script)?/gi;
let str = "First HTML appeared, then CSS, then JavaScript";
alert( str.match(reg) ); // '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にマッチします。
時間の正規表現
前のチャプターで、12:00 のような形式 hh:mm の時間を探す正規表現を構築するタスクがありました。しかし、単純な \d\d:\d\d はあまりにも要領を得ません。これは 25:99 も時間として許容します。
どうすればより良い正規表現を作れるでしょうか?
その方法として、私たちはより慎重なマッチングを適用することができます。まず、時(hour):
- 最初の数字が
0か1の場合、その後は任意の数値になります:[01]\d。 - そうではなく、最初の数字が
2の場合、次は[0-3]でなければなりません。 - (最初の数字がそれ以外のものは許可されません)
論理和指定子を使用した、両方を含む正規表現は次の通りです: [01]\d|2[0-3].
次に、分 は 0 から 59 までである必要があります。正規表現では [0-5] と記述することができます。: 最初の数値 0-5, その後に任意の数字を続きます。
時と分をあわせると次のパターンになります: [01]\d|2[0-3]:[0-5]\d.
ほぼほぼできていますがまだ問題があります。論理和指定子 | は [01]\d と 2[0-3]:[0-5]\d の間です。
つまり、このようになります
[01]\d | 2[0-3]:[0-5]\d
このパターンは [01]\d あるいは 2[0-3]:[0-5]\d を探します。
しかし、これは間違いです。OR は正規表現の “時” の部分にのみ使用される必要があります。[01]\d OR 2[0-3] とするために。“時” を括弧で囲むことで正しくしましょう: ([01]\d|2[0-3]):[0-5]\d。
最終的な解決策です:
let reg = /([01]\d|2[0-3]):[0-5]\d/g;
alert("00:00 10:10 23:59 25:99 1:2".match(reg)); // 00:00,10:10,23:59
コメント
<code>タグを使ってください。複数行の場合は<pre>を、10行を超える場合にはサンドボックスを使ってください(plnkr, JSBin, codepen…)。