論理和指定子は、実際には単純な “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