見出し画像

正規表現

rubyを使用

\d : 0~9までの半角数字を1つ表す

ex) 私の電話番番号は1234567です。→1~7が \d で引っ掛かることになる。でも\dが表しているのは数字一個のみなので1234567を表すには\d\d\d\d\d\d\dとなる。

text = "私の電話番番号は1234567です。"
text.scan  \d\d\d\d\d\d\d
=> 1234567

→\dを何度も書くのはめんどくさい。

\d{n}  \d{n, m}: 文字量を指定(量指定子)

\dを表す数だけ書く必要がなく、{}内の数で指定することができる。また、{}内に数を二つ記述することにより、\dをn~m個のように、範囲を指定することができる。

ex1) 電話番号の090-8989-4649, を正規表現で表すと
\d{3}-\d{4}-\d{4}
ex2) 0423-9090-8929と080-97-5610のようなハイフンで囲まれていることは一緒だがそれぞれの数が異なる場合範囲を指定することで正規表現で表現可能である。
like this 
\d{3, 4}-\d{2, 4}-\d{4}

[]:指定の文字を表す

何を言いたいかというと上の例ではハイフンを使っているのに対して、カッコを使う電話番号の指定方法もある。
0423-9090-8929 080(97)5610 一つの正規表現でこの二つの電話番号を示すにはさっきまでは-で指定していた部分を()が入っても検索できるようにすればいい。

この時に使うのが[]で[-()]と書くと ”-” or ”(" or ")"が来たときに検索に引っかかるように出来るのである。よって

\d{3, 4}[-(]\d{2, 4}[-)]\d{4}と表せる

ex2)私はA型です。私はC型です。、、、私はZ型です。
なんの型だかはよくわからんが、A~Zどれかが入るものを検索するには上に従うと[ABCDEFJHIJKLMNOPQRSTUVWXYZ]と書けばいいと思うが少し長すぎるのでA~Zというのは[A-Z]のようにハイフンを使って表せる

ここで思うのは[A-Z]はAまたは-(ハイフン)またはZという意味じゃないの?ということ。
→実はハイフンは[]の中では特別な意味を持ち、文字と文字の間にあるときには~の役割を持つ。とはいえ、Aまたは-またはZというのを現したいこともあるだろう。そんな時は、AとZの間ではなく、最初か最後につけると良い。
[AZ-]or[-AZ]
※この[]内では半角スペースや全角スペースの表現可能

?:[]の有無を表現

例えば名前を表現するときに苗字と名前の間に区切り(・など)を入れる人や、スペースを入れて書く人、スペースを開けない人がいる。これに対応するために、?を使うと
山田・太郎、山田 太郎、山田 太郎 → 山田[ ・]?太郎

のように[]の後ろに、?をつけることで、[]のなかの文字がある、もしくは何もない。に対応できるようになった。

.:全ての文字を表現

.は任意の1文字を表すことが出来る。

+:直前の文字を1文字以上を表現

""内に含まれる任意の文字を検索する。
ex) "私はポップコーンを2つ食べます"これは上の.と+を組み合わせると
".+"と表せる。

*:直前の文字を0文字以上を表現

+を使う時は上の例でいくと、""内に文字が存在しないといけなかったが*を使うと、文字が存在しなくても検索できるようになる。

()、()?:文字列を指定(文字列がなくても問題ない)

自分が対象としたい文字列ex) nameを()かっこで囲むことでこのnameという文字列をグループ化。グループ化したことで?を使うと()内の文字列を一つのものとして捉えることができ(name)?と書くと、文字列nameが存在する、または、nameが存在しないときを表すことが出来る。

\w:a~z, 0~9, A~Zを一つ表す。

\dは半角数字だったのに対し、\wはa~z, 0~9, A~Zの英単語を全て表すことが出来る。

[^]:〜以外の文字を表す。

.は全ての文字を表現出来ると書いたが、aとc以外の全ての文字列を表現したと思ったときはどうすればいいだろう?
そのときに使うのは[^]。[^ac]と書くとaとc以外の全ての文字列を表現できる。

^:行の先頭を表す。

$:行末を表す。

\t:tab文字を表す。

\s:半角、全角スペースなど空白全般を表す。

もっと知りたい人

The following metacharacters also behave like character classes:

/./ - Any character except a newline.

/./m - Any character (the m modifier enables multiline mode)

/\w/ - A word character ([a-zA-Z0-9_])

/\W/ - A non-word character ([^a-zA-Z0-9_]). Please take a look at Bug #4044 if using /\W/ with the /i modifier.

/\d/ - A digit character ([0-9])

/\D/ - A non-digit character ([^0-9])

/\h/ - A hexdigit character ([0-9a-fA-F])

/\H/ - A non-hexdigit character ([^0-9a-fA-F])

/\s/ - A whitespace character: /[ \t\r\n\f]/

/\S/ - A non-whitespace character: /[^ \t\r\n\f]/

いいなと思ったら応援しよう!