正規表現でぴったり1回繰り返しのみをマッチさせる
公開日:
目的の正規表現
sample.js
/(?<!\[)\[{1}(\/.*?)\]{1}(?!\])/;
この正規表現は[/Sandbox/Math]
にはマッチするけど、[[/Sandbox/Math]]
にはマッチしません。
[
と]
が正規表現では、エスケープする必要があり、\[
や\]
になっているため、難しいように感じますが、分解すればそこまで難しくないです。
分解してみる
この正規表現を分解すると、(?<!\[)
と\[{1}
と(\/.*?)
と\]{1}
と(?!\])/
に分割できます。
否定後読み、否定先読み
https://www.javadrive.jp/regex-basic/writing/index2.html
(?<!\[)
と(?!\])
は、正規表現の後読みと先読みの否定表現で、
(?<!パターン)
(?!パターン)
とすることで、後ろににこの文字がこない、前にこの文字がこないという意味になります。
繰り返し
\[{1}
と\]{1}
は繰り返しの正規表現です。
パターン{n} // パターンのn回繰り返し
今回の例では[
や]
という文字が 1 回だけ繰り返されるという意味になります。
1 回だけ繰り返し
繰り返しの手法を知っていると、否定先読みと否定後読みはいらないのでは?
sample.js
/\[{1}(\/.*?)\]{1}/;
これでいいのでは?となりますが、これだと
[/Sandbox/Math]
[[/Sandbox/Math]]
の二つともにマッチしてしまいます。今回は[/Sandbox/Math]
のみにマッチして欲しかったので、
1回繰り返し。かつ、前と後ろに`[`や`]`がこない。
という条件にすることで、[/Sandbox/Math]
だけにマッチさせました。
まとめ
先読みや、後読みの正規表現を暗記する必要はないかと思いますが、こういう正規表現があるということを頭に入れておくだけで、悩んだり調べたりする時間は圧倒的に減るかもしれません。
では
Bye