🫧

正規表現まとめ

2024/03/20に公開

これはなに

今まで正規表現をなんとなくで使ってたけどちゃんと理解して使いたいなぁと思い備忘録的にまとめてみる。

正規表現とは

いくつかの文字列を一つの形式で表現するための表現方法。
英語で regular expression と呼ぶ。
例えば?を用いて以下のようにすれば、「おい」「おーい」を表現できる。

おー?い

特殊文字

一つの形式で表現するために以下の文字に特別な意味を与えている。
これらの文字を特殊文字(メタ文字)という。

特殊文字
.   ^   $   [   ]   *   +   ?   |   (   )

ちなみにこの特殊文字を単なる普通の文字として扱いたい場合は、その特殊文字の前に、\を付加する。

エスケープ
\.  \^  \$  \[  \]  \*  \+  \?  \|  \(  \)

なんでもいい1文字(.

. は、なんでもいい1文字を表す。

僕は.です

「僕は人です」「私は魚です」がマッチする。

私は...が..

「私はうどんが嫌い」「私は早起きが苦手」がマッチする。

console\.log

「console.log」がマッチする。
特殊文字である.をエスケープしているため、「なんでもいい1文字」ではなく普通のピリオド(.)として扱われる。

行の先頭と最後(^, $

^ は、行の先頭を表す。

^ありがとう 

「ありがとうと言いたい」がマッチする。
「私はありがとうと言った」「本当にありがとう」は先頭にありがとうがないのでマッチしない。

$ は、行の終わりを表す。

ありがとう$

「本当にありがとう」がマッチする。
「ありがとうと言いたい」「私はありがとうと言った」は終わりにありがとうがないのでマッチしない。

^ありがとう$

「ありがとう」がマッチする。
「ありがとうと言いたい」「私はありがとうと言った」「本当にありがとう」はいずれもマッチしない。

同じ文字の繰り返し(*, +, ?

*は、直前の1文字の0回以上の繰り返しを表す。
0回以上なので直前の1文字がなくても良い。

おー*い

「おい」「おーーい」「おーーーーい」がマッチする。

+は、直前の1文字の1回以上の繰り返しを表す。
*は、直前の1文字がなくてもよかったが、+は最低でも1個以上連続する必要がある。

おー+い

「おーい」「おーーい」「おーーーーい」がマッチする。

?は、直前の文字の0回または1回だけの登場を表す。

おー?い

「おい」「おーい」がマッチする。

なんでもいい文字の連続(.*

復習すると、
.は、とにかくなんでもいい1文字を表す。
*は、直前の1文字の0回以上の繰り返しを表す。

つまり、
.*は、とにかくなんでもいい1文字がまったくないか、連続するかという意味を表す。

君が好き.*。

「君が好き。」「君が好きです。」がマッチする。
.*は何かの文字で始り何かの文字で終わる文字列を指定する時に有用。

いずれかの文字列(|

|は、|で区切られた文字列のいずれかの文字列が存在した時に、正規表現に合致する。

Python|JavaScript|Go|Dart

「Python」「JavaScript」「Go」「Dart」がマッチする。

指定した文字のどれか([]

[]は、[]で括られた中の文字が、どれか1つに合致する時に、正規表現に合致する。

今日は[金土]曜日です。

「今日は金曜日です。」「今日は土曜日です。」がマッチする。
「今日は月曜日です。」はマッチしない。

なお、aからzまで全てのアルファベットを表したい時、以下のようにかける。

[a-z]

数字だと0から9全ての数字を表したいならこのように書ける。

[0-9]

連続して書くことも可能。

[a-z0-9]

さらに、[]の中で^を使うと、それ以外の意味を表す。
例えば下記は、COとCOの間にくるのはAからZ以外の文字という意味になる。

CO[^A-Z]CO

グループ化(()

()は、 ()の中をグループ化する。

(じゃ)+ーん

「じゃーん」「じゃじゃーん」「じゃじゃじゃーん」がマッチする。
+は、直前の文字が1個以上連続するという意味を表す。
()でグループ化しているため、()で囲まれた「じゃ」が一個以上連続するという意味になる。

Flash Card

復習用フラッシュカード。

`.`は何を意味する?

+は、直前の1文字の1回以上の繰り返しを表す。

`^`は何を意味する?

^は、行の先頭を表す。

`$`は何を意味する?

$ は、行の終わりを表す。

`*`は何を意味する?

*は、直前の1文字の0回以上の繰り返しを表す。

`+`は何を意味する?

+は、直前の1文字の1回以上の繰り返しを表す。

`?`は何を意味する?

?は、直前の文字の0回または1回だけの登場を表す。

`.*`は何を意味する?

.*は、とにかくなんでもいい1文字がまったくないか、連続するかという意味を表す。
.*は何かの文字で始り何かの文字で終わる文字列を指定する時に有用。

`|`は何を意味する?

|は、|で区切られた文字列のいずれかの文字列が存在した時に、正規表現に合致する。

`[]`は何を意味する?

[]は、[]で括られた中の文字が、どれか1つに合致する時に、正規表現に合致する。

`()`は何を意味する?

()は、 ()の中をグループ化する。

参考

Discussion