初めに
初めて正規表現を書こうと思ったので、大まかな書き方をまとめておく。
C++での書き方はまた次回。
正規表現とは
正規表現(せいきひょうげん、英: regular expression)は、文字列の集合を一つの文字列で表現する方法の一つ。
wikipediaより
今回はPerl系で用いられている記法も含まれる
記法
.
任意の一文字にマッチする
.a <- aa,na など
*
指定したパターンが0回以上繰り返されている場合にマッチする
a* <- 空文字、a,aa,など
?を用いると最も短いものにマッチする
a*? <- 空文字
+
指定したパターンが1回以上繰り返されている場合にマッチする
a+ <- a,aa,aaaaaなど
?を後ろにつけると最小の場合にマッチする
a+? <- a
{}
繰り返しの回数を指定する
最大回数は省略可能、
最小回数は省略不可
a{1,5} <- aが1回以上5回以下繰り返される
a{1,} <- aが1回以上繰り返される
a{0,5} <- aが5回以下繰り返されている
?を後ろにつけると最小の場合にマッチする
a{1,5}? <- a
?
指定したパターンが0回または1回繰り返されている場合にマッチする
ba? b,ba
^
行頭が指定したパターンの場合にマッチする
^h <- h,ht,hogeなど
$
末尾が指定したパターンの場合にマッチする
e$ <- e, se,hogeなど
()
文字列をグループ化する
(hoge)
\1、\4でグループ化したものにキャプチャできる
(.)hoge\1 <- ahogea,hhogehなど
(?:hoge)のように?:から始まるものにはキャプチャされない
[]
指定した文字にマッチする
[a-d] <- a,b,c,d
[agh] <- a,g,h
^で指定した文字以外にマッチする
[^a-d]<- a,b,c,d以外
|
左右どちらかのパターンがマッチした文字列にマッチする
a|b <- a,b
エスケープシーケンス
記法で紹介した文字と、\は\でエスケープできる。
ほかにも既定のエスケープシーケンスが存在する。
\d
[0-9]にマッチする
\w
[a-zA-Z_0-9]にマッチする
\s
空白文字にマッチする
\D、\W、\Sは対応する小文字以外にマッチする。
メールアドレス
メールアドレスの正規表現は複数種類ある。
今回は
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
について解説
-
[a-zA-Z0-9._%+-]+
-> ユーザー名に一致
[\w.%+-]と同じ
これらの文字が1回以上繰り返されてる -
@
ユーザー名とドメイン名との間の@ -
[[a-zA-Z0-9.-]]+
-> ドメインのはじめの部分gmail,outlookなど -
\.
.に一致 -
[a-zA-Z]{2,}
com、ioなどドメインに一致
このように、文字列を比較、分類できる。
よくある間違い
-
.は「改行文字」にはマッチしない(re.DOTALLオプションでマッチ可能) -
*や+は「貪欲(greedy)」マッチ。?を付けないと想定以上にマッチしてしまう
終わりに
意外と単純で便利。
~Thank you for reading~