正規表現でぴったり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