正規表現
Regular Expression
Regexp, Regex
正規表現を文法として持っている言語がある。
正規表現は文字列の判定と解析で簡便な記法であるため多用される。
C言語
外部ライブラリで実現している。
POSIX regex 関数
JavaScript
よく使われている文法(正確性よりも分かりやすさで記述)
a 文字その物
\a エスケープ。メタ文字を文字その物として扱う。
. 任意の文字
[abc] いずれかの文字
[^abc] いずれかの文字以外
abc|def|ghi いずれかの文字列
(abc) グループ化(これを1つの要素としてまとめる。繰り返し指定などの対象となる)
位置のマッチ
^ 行頭(文字列始端)
$ 行末(文字列終端)
繰り返し指定
? 前の要素を0回か1回繰り返す
* 前の要素を0回以上繰り返す
+ 前の要素を1回以上繰り返す
{n} 前の要素をn回繰り返す
{n,} 前の要素をn回以上繰り返す
{,m} 前の要素をm回以下繰り返す
{n,m} 前の要素をn回以上m回以下繰り返す
「特定の文字列を含まない文字列」の正規表現
正規表現は、歴史的に「マッチする文字列」を表現するために作られてきた。
このため、「マッチしない文字列(アンマッチする文字列)」を表現するのが実はかなり難しくなっている。
1文字のアンマッチ、たとえば「a以外の文字」は [^a] という形で表現することができる。
繰り返しも[^a]?や[^a]*として表すことができる。
連続する2文字のアンマッチ「ab となる文字列以外」はどう書けば良いのか?
これは、パターンをあげるしかなく、1~2文字であることが保証されているならば、(a|b|a[^b]|[^a]b|[^a][^b])となる。
しかし、これは繰り返すことができない。なぜならば、単独の文字aと別の単独の文字bの出現を許しているため。
また、文字列が一致しないことと、次に現れる文字が一定のパターンを持っていることとは、また別の話になっているため混乱を招いている。
C言語のコメントは、"/*"の後"*/"が現れることを期待している。これを正規表現で書くにはどうすればよいか?
"/\*"までは迷うことがない。
単純に考えると、"/\*.*\*/"のようになる。しかしこれは最長一致してしまうので正しくない。
参考