LoginSignup
3
0

More than 1 year has passed since last update.

正規表現は、文字列の検索パターンを表現するための記法です。英語では、Regular ExpressionRegexと呼ばれたりします。言語やツールにより多少の違いがあります。

正規表現については、ドットインストールで勉強することができます。この記事は、その内容を備忘録的に、メモしています。復習やチートシートのとして、利用いただけたら幸いです。

  1. メタ文字を使う
  2. 文字種
  3. 量指定子

文字をそのまま検索で使うことをリテラルと言います。

メタ文字を使う

.を使う

メタ文字を使うことで高度の検索をすることができます。.は、改行を除く任意の1文字という意味です。
例えば、bat cat hat jetという文字列があった場合、.atとするとjet以外の文字列が、検索対象となります。

\を使う

This is a pen..を検索対象としたい場合、.を使うと全ての文字が検索対象となってしまいます。\(バックスラッシュ)を使って、\.とすると、メタ文字をエスケープすることができ、.リテラルとして検索対象にすることができます。
\を検索対象にする場合は、\\として、検索します。

文字種

  • \d -> 0-9
  • \D -> \d 以外
  • \w -> a-z, A-Z, 0-9, _
  • \W -> \w 以外
  • \s -> スペース, タブ, 改行など
  • \S -> \s 以外

数字を置換する

例題
ito, 03-0123-4567
sato, 03-1234-5678
tanaka, 03-9876-5432

上記の電話番号の部分を検索対象にして、xx-xxxx-xxxxで置換したい場合は、

Find
\d\d-\d\d\d\d-\d\d\d\d
Replace
xx-xxxx-xxxx

としてあげると、

結果
ito, xx-xxxx-xxxx
sato, xx-xxxx-xxxx
tanaka, xx-xxxx-xxxx

とすることができます。

文字列を置換する

今度は、下記のtanakat以外を伏せ字にしてみます。

例題
ito, 03-0123-4567
sato, 03-1234-5678
tanaka, 03-9876-5432

tで始まる6文字の文字列なので、

Find
t\w\w\w\w\w
Replace
t*****

とすると、

結果
ito, xx-xxxx-xxxx
sato, xx-xxxx-xxxx
t*****, xx-xxxx-xxxx

と置換する事ができます。

量指定子

量指定子を使うと、\d\d\d...と続くものを省略して書く事ができるので便利です。
{n}を使うと、n個、{min,max}を使うとmin以上、max以下{min,}は、min以上`という意味で連続するものの数を指定して、書く事ができます。

例えば、下記のような電話番号を指定するには、

電話番号
03-0123-4567
\d{2}-\d{4}-\d{4}

のように検索する事ができます。
また下記の2つの番号を検索する場合は、

電話番号
03-0123-4567
090-0123-4567
\d{2,3}-\d{4}-\d{4}

とすると、両方に一致させる事ができます。
このように、量指定子を使うと簡単に書く事ができて便利です。
下記の、名前の4文字以上を検索対象にしたい場合は、

例題
ito, 03-0123-4567
sato, 03-1234-5678
tanaka, 03-9876-5432
\w{4,}

すると、satotanakaに一致させる事ができます。

? + *

?{0,1}+{1,}*{0,}という意味です。もしこの意味がわからなければ、一つ上のセクションの量指定子を見てみてください。

下記の2つの番号に一致させたい場合は、

03-1234-5678
0312345678
regex
\d{2}-?\d{4}-?\d{4}

とするとどちにも一致させることができます。

また下記の2つの番号に一致させたい場合は、

TEL03-1234-5678
T0312345678
regex
\w+\d{2}-?\d{4}-?\d{4}

とするとどちにも一致させることができます。

下記の4つの番号に一致させたい場合は、

03-1234-5678
0312345678
TEL03-1234-5678
T0312345678
regex
\w*\d{2}-?\d{4}-?\d{4}

とすると全てに一致させることができます。

次のような文字列を検索する場合は、

"apple", "apples", "pineapple"
regex
".+?" 

とすると一致させることができます。
この場合の?は先に説明した意味とは異なる意味を持っているようです。

アンカー

アンカー配置を指定するのに使います。^行の先頭$行の末尾\b単語の境界を意味するメタ文字です。
^は、次のように、行頭の数値に一致させたい場合で、他にも数値がある場合に使えます。

1 sato 6
2 ito 9
3 tanaka 8
4 saito 7
regex
^\d

とすると一致させることができます。
また、

regex
\d$

とすると末尾の数値に一致させることができます。

検索に、itoと入力するとitosaitoの一部のitoにも一致してしまいますが、単語としてのitoのみに一致させたい場合は、以下のようにすると単語としてのitoのみに一致させることができます。

regex
\bito\b

選択子

abc|123とするとabcまたは、123という意味になる。
下記の文字列に一致させたい場合、

example.com
example.net

下記の2つの書き方で一致させることができる

regex
example\.com|example\.net
example\.(com|net)

文字クラスを使う

下記の文字列に一致させたい場合、

bat cat hat

下記の2つの書き方で一致させることもできるが、

regex
bat|cat|hat
(b|c|h)at

[]を使って、

regex
[bch]at

としても一致させることができる
[abc]は、a,b,cのどれか1文字という意味になる

^で否定の表現

[の直後で、^を使うと否定の表現になる。
下記の文字列で、cat以外に一致させたい場合

bat cat hat eat

下記のようにすると一致させることができる

regex
[^c]at

また、hatのみに一致させたい場合は、

regex
[^cb]at

としても一致させることができる。

-で範囲指定

例えば[A-F] とするとAからFという意味になる。
下記のリストのAからFに一致させたい場合は、

A1
Q31
N18
C5
E32
L4

下記のようにすると一致させることができる

regex
[A-F]\d+

この範囲指定を使うときは、文字コード表を参考にするといいみたいです。
下記に参考の表を貼っておきます。もしもっといいものがあれば教えてください。
ASCII

文字クラスのルールに慣れる

下記のような電話番号があり、全てに一致させたい場合

03^1234^5678
03-1234-5678
03.1234.5678
regex
^\d{2}[^-.]

としてしまうと、[の直後に^が来てしまっているので、否定の意味になってしまう。\を使って、エスケープすることができるが、
すると、-が範囲を指定するメタ文字として認識されてしまいます。なので、 また\エスケープします。

文字クラス内でのルール

他にもエスケープするものや、順番によってはエスケープしないものなど、状況によっても変わってきます。
[]内では、]もエスケープが必要で、[\]]のように書いてエスケープします。
\[\\]のようにエスケープします。
上記の[^-.]についてですが、[]内では、.は、リテラルなので、エスケープする必要がありません。また、[-.^]の順番で書いた場合、-は範囲を表さず、^は、[の直後ではないのでエスケープする必要がありません。

最終的に以上のルールを踏まえて、一致させると下記のようになります。

regex
^\d{2}[-.^]\d{4}[-.^]\d{4}[-.^]$

タブと改行

\tタブを表す。改行は、OSによって異なり、Windows\r\nV9までのmacOS\rUinuxV10以降のmacOS\n改行を表す。選択肢を使って\r\n|\r|\nとすると、全てのOSに対応させることができる。
下記の文字列の改行を一つに統一したい場合は、

abc

a
b


c

下記のようにして一個以上の改行に一致させて、

regex
n\+

n\で置き換えると

regex
abc
a
b
c

上記のように改行が一つに統一される。

キャプチャを使って置換する

()を使うと、括弧内の内容を記憶することができる。
例えば、下記のようなリストがあって、それをHTMLのリンクタグにしたい場合、

google,https://google.com
example, https://example.com

下記のようにすると一致させることができる。

regex
.+,\s?.+

()を使って記憶させて、

regex
(.+),\s?(.+)

$1,$2を使って、置き換えると、

regex
<a href="$2">$1</a>
regex
<a href="https://google.com">google</a>
<a href="https://example.com">example</a>

となり、リストをHTMLのリンクに置き換えることができました。

後方参照

下記のような文字列があり、前の数字が後ろの数字と一致しているかを調べたい場合、

3, 8, 5, 4, 4, 5, 4, 1, 1, 5, 3, 3

()\1を使って、

regex
(\d),\s\1

とすると、4, 41, 13, 3などの連続している数字に一致させることができる。
\1は、後方参照するものが多ければ、\1, \2, \3, ...と使うことができる。

以上が、ドットインストールで勉強できる内容です。
下記のURLより、勉強することができます。

ドットインストール
dotinstall.com

 
RegExr:Regexを勉強するのに便利な有名なサイトです。ドットインストールの勉強をこのサイトでするのもおすすめです。

by Web Dev Simplified
Regexr Website を使ったとてもわかりやすい解説です。Regexrを使ったことがない人は、ぜひ使ってみてください。Regexを勉強するための一番有名なサイトです。説明なども読むことができるのでとても便利です。

Regular Expressions Tutorial

Regular Expressions 101
Course files

Simple RegEx Patterns

Literal, Regex Flag, global, insensitive

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0