正規表現メモ
- 記事再編
- 記事投稿
かなり大味な正規表現についてのまとめです。
記述方法
基本
下記形式で記述
/マッチ条件/フラグ
例
/abc/
/abc/g
/a.?c/gi
フラグ
フラグとは
マッチ条件にさらに条件付けができます。
フラグの種類
g
global
-
マッチ条件に当てはまる全てを対象にする
未指定時、一番最初の合致対象以外は無視される i
- ignoreCase
- 大文字,小文字を区別しない
m
- multiline
-
行を対象とする
マッチ条件にて、「先頭,末尾」の指定時にそれぞれ「行頭,行末」とする s
- dotAll
- マッチ条件にて、「全ての文字」の対象に改行コードを含める
u
- unicode
- Unicodeのサロゲートペア文字を一字として扱う
マッチ条件
一字を示す
.
-
▽例
マッチ条件を
/a.c/
とした場合、abcabcaびc等、.
部分の文字は何でもマッチする※
s
フラグ未指定時、改行コード(LF,CR,u+2028,u+2029)は対象に含まない為注意 \w
-
[0-9a-zA-Z_]
と同内容 \W
-
[^0-9a-zA-Z_]
と同内容 \d
-
[0-9]
と同内容 \D
-
[^0-9]
と同内容 \s
-
スペース(タブ,全角,BOM等あらゆるスペース)、改行(LF,CR,u+2028,u+2029)を対象とする
\S
\s
以外の全て\t
- タブスペース(水平)
\n
- 改行(LF)
\r
- 復帰(CR)
\
-
下記の、正規表現上で意味を持つ記号を文字として指定する場合に使用
-
/
\
^
$
*
+
?
.
|
(
)
[
]
{
}
▽使用例
\dという文字列にマッチさせたい
/\d/
:数字にマッチしてしまう/\\d/
:\dにマッチ []
-
▽使用例
/[abc]/
:abcいずれかにマッチ▽表記省略
連続する文字コード間は
-
で省略可例:
/[0-9a-f]/
=/[0123456789abcdef]/
▽内部での正規表現の扱い
前述してきた
\z
形式の、一字を示すもの以外は正規表現として扱われず、ただの文字とされます。例:
/[\n\d]/
:改行か数字にマッチ例:
/[(.*)]/
:().*のいずれかにマッチこのため一部記号はエスケープ不要となる。
[^]
[^
]
内以外のいずれか()
(
)
内を一字扱いし、 する-
▽キャプチャ
()
の出現順に1から番号を振り、マッチ内容を記憶するマッチ内容の引用に有用
(?:)
(?:
)
内を一字扱いする、キャプチャはしない|
▽使用例
/abc|def/
:abcdefどちらかにマッチ/abc|def|ghi/
:abcdefghiのいずれかにマッチ一部のみ分岐させたい場合は
()
(?:)
を併用例:
/(abc|ABC)def/
:abcdefABCdefどちらかにマッチ\1
1
はキャプチャ番号回数の指定
回数指定は基本的に
とするまた、
となる最長一致
:条件に合う一番長い部分▽例
探索対象: A子は10歳だがB子は9歳だ
一致条件:
/A子.+歳/
マッチ : A子はだが10歳B子は9歳
最短一致
:条件に合う一番短い部分▽例
探索対象: A子は10歳だがB子は9歳だ
一致条件:
/A子.+?歳/
マッチ : A子は10歳
-
:+
例:
/ab+c/
:abcabbcabbbbbbbc等にマッチ -
:*
例:
/ab*c/
:acabcabbbbbbbc等にマッチ -
:{n}
例:
/ab{3}c/
:abbbcにマッチ -
:{m,n}
例:
/ab{2,4}c/
:abbcabbbcabbbbcにマッチまた、m,nはどちらか省略可能である
例:
{3,}
:3回以上の繰り返し{,8}
:8回以下の繰り返し -
: 直前の一字により意味合いが変わる?
文字を示す場合:
例:
https?://
:http://https://どちらかにマッチ回数を示す場合:
出現位置の指定
-
:^
▽例
探索対象: A子は10歳だがB子は9歳だ
一致条件:
/^.子は\d+?歳だ/
マッチ : A子は10歳だ
-
:$
▽例
探索対象: A子は10歳だがB子は9歳だ
一致条件:
/.子は\d+?歳だ$/
マッチ : B子は9歳だ
-
:(?<=)
記述例:
(?<=abc)def
→直前がabcのdefにマッチ
-
:(?<!)
記述例:
(?<=abc)def
→直前がabc以外のdefにマッチ
-
:(?=)
記述例:
def(?=abc)
→直後がabcのdefにマッチ
-
:(?!)
記述例:
def(?!abc)
→直後がabc以外のdefにマッチ
記述例
一字を示す
[a-z]
: 半角アルファベット小文字 [A-Z]
: 半角アルファベット大文字 [a-zA-Z]
: 全角アルファベット [0-9]
: 全角数字 [ぁ-ん]
: ひらがな [ァ-ヴ]
: カタカナ [ヲ-゚]
: 半角カタカナ \x20
: 半角スペース 行関係
※
m
フラグ必須-
:^.*?$
^.+?$
:空行を含めない^.*?\n
:行末の改行コード含む※
s
フラグ未指定時は?
不要 -
:^[\t\x20]+
^[^\S\n\r\u2028\u2029]+
:より厳密な指定 -
:^$
^\n
:行末の改行コード含む
回数の指定
※
abc
部分を回数指定したい内容に置き換えてください。-
:((?:abc){2})+
((?:abc){n})+
:nの倍数回繰り返し((?:abc){n})*
:nの倍数回繰り返し(0含む) -
:((?:abc){2})*abc
((?:abc){n})+(?:abc){m}
:nの倍数+m回の繰り返し
汎用
-
: urlhttps?:\/\/[\w\/\.\-?#=&%]*
-
: yyyy/mm/dd\d{4}\/\d{2}\/\d{2}
\d{4}-\d{2}-\d{2}
:yyyy-mm-dd\d{4}年\d{2}月\d{2}日
:yyyy年mm月dd日より厳密にするなら、月部分は
(?:0\d|1[12])
、日部分は(?:[0-2]\d|3[01])
とかそもそも正規表現とは
ざっくり言うと、文字列をパターン化したものです。
様々なプログラミング言語やoffice系含む多くのソフトにおいて、多少構文に差はありますが利用できるので覚えておいて損はないと思います。(上記解説はjavaScript及びjQuery用)
利点
平たく言うと諸々楽になります。
例
商品A:100円
商品B:340円
商品C:1200円
商品D:100円
上記文字列から商品毎の情報を取得する場合
文字列での指定
商品A:100円
商品B:340円
商品C:1200円
商品D:100円
商品毎の記述が必要
正規表現での指定
/.+?:\d+?円/g
これだけ
こんな感じで「ただの文字列」から情報を抽出したい際に滅法強いです。
文字列の置き換えなんかで真価を発揮するのでこちらで試してみてください。(『change』クリックでテーブルタグに変換されます)