正規表現はややこしいので覚えるのが大変で、しかも言語ごとに若干異なるのでまとめました。 間違っていたらコメント頂けたらありがたいです。
言語別正規表現記法
クリックで内容が見れます。
Javascript記法
//で括る場合と、RegExpオブジェクトのコンストラクターを経由する場合の2通りがある。//内で『/』を使う時は『\/』のエスケープ処理が必要。
var str = /正規表現/オプション; var str = new RegExp('正規表現','オプション'); var str = "ABCDEFG" var result1 = str.match(/[a-d]/gi); //gは複数検索、iは大文字小文字無視のオプション。 console.log(result); //-> (4) ["A", "B", "C", "D"] var result = /(.+)cde(f)/.exec("abcdefgcdef"); console.log(result); //->[ 'abcdefgcdef', 'abcdefg', 'f', index: 0, input: 'abcdefgcdef', groups: undefined ]
- match():配列で返す。 マッチしなければnull。
- exec():配列で返す。正規表現の()がどことマッチしたかも配列に含まれる。 検証用に便利。 全体マッチしなければnullを返す。
- オプションなし:文字列の一行目のみ調べる。
- iオプション:大文字小文字区別なし。
- gオプション:マッチする部分を複数取り込む。
- sオプション:シングルラインモード。改行も文字としてマッチ。複数行あっても1行とみなす場合。
- mオプション:『^』『$』の先頭・末尾マッチが1行目以外の行でもマッチする。
jQuery
$(`#sidebar a[href^="#toc"]`).css('background-color', 'Transparent'); $(`.main span[id="${this.ids[this.index]}"]`).css('text-shadow', '0 0 0.5rem LightSkyBlue'); $(`.main h2:has(span[id^="toc"]), .main h3:has(span[id^="toc"]) `).css('background-color', 'Transparent');
Python記法
raw文字r”で括る方法がバックスラッシュのエスケープ処理が不要となるので最も便利。 reモジュールを使い正規表現での検索・置換ができる。
s = 'aaa@xxx.com' m = re.match(r'[a-z]+@[a-z]+\.[a-z]+', s) print(m) #
- search(), match(), fullmatch():matchオブジェクトで返す。
- start(), end(), span()メソッド:位置取得
- group()メソッド:文字列取得
- groups()メソッド:グループの文字列取得
- findAll():配列で返す。
PHP記法
‘/正規表現/オプション’『’』か『”』で括る。 バックスラッシュのエスケープ処理は必要。
1 echo preg_match("/c[aeiou]t/", "I love my cat", $matches); //->1 var_dump($matches); //->array(1) {[0]=> string(3) "cat"} echo preg_match("/c[aeiou]t/", "I love my dog"); //->0 ?>
- オプションなし:文字列の一行目のみ調べる。
- iオプション(PCRE_CASELESS):大文字小文字区別なし。
- sオプション(PCRE_DOTALL):シングルラインモード。改行も文字としてマッチ。複数行あっても1行とみなす場合。
- mオプション(PCRE_MULTILINE):『^』『$』の先頭・末尾マッチが1行目以外の行でもマッチする。
- xオプション:文字列内の空白やコメントを無いものとする。
- uオプション(PCRE_UTF8):文字列をUTF-8として扱う。
- eオプション:置換文字列をPHPコードとして実行。
- Uオプション:最短マッチ。
- preg_match(regExp,in_str [, $matches, flag]):$matchがあると配列でマッチした文字を返す。 $matchが無い場合は1か0を返す。
- preg_replace(regExp, rep_str, in_str):マッチした部分をrep_strで置き換える。
- preg_split(regExp, in_str):マッチした部分でin_strを分割し配列で返す。
Go記法
バッククォーテーションで括る方法がバックスラッシュのエスケープ処理が不要となるので最も便利。
str = "Hello Go!!" regex = regexp.MustCompile(`Go`) fmt.Println(regex.MatchString(str)) // -> true fmt.Println(regex.FindString(str)) // -> Go fmt.Println(regex.FindStringIndex(str)) // -> [6 8] fmt.Println(regex.FindAllString(str, -1)) // -> [Go] fmt.Println(regex.ReplaceAllString(str, "ichiri")) // -> Hello ichiri!! regex2 = regexp.MustCompile(`(\w+)\s(\w+)`) fmt.Println(regex2.ReplaceAllString(str, "$2 $1")) // -> Go Hello!!
正規表現一覧
正規表現記号 | 内容 |
---|---|
^ | 直後文字 行の先頭になる場合マッチ ^(.*)?は何らかの文字列がある場合もない場合も全てマッチ JavaScript Python php GO |
. | (ドット) 改行(\n)以外の任意の文字(何でもOK) JavaScript Python php GO |
+ | 直前文字 1回以上繰り返す場合マッチ。 "yaho+" は "yaho" , "yahooo" にはマッチしますが "yah" にはマッチしない。 JavaScript Python php GO |
* | 直前文字 0回以上繰り返す場合マッチ。 JavaScript Python php GO |
? | 直前文字 0個か1個の場合マッチ。 JavaScript Python php GO |
$ | 直全文字 行の末尾になる場合マッチ JavaScript Python php GO |
| | ORと同じ。 "abc|def"は"abc"か"def"とマッチ。 123(45|67)も可能 console.log("2021120".match(/21|4/)); //->[ '21', index: 2, input: '2021120', groups: undefined ] JavaScript Python php GO |
[ ] ・何れかの文字 | 角括弧内に含まれる文字のどれか1つにマッチ。
範囲指定は[a-mN-O0-9]。
[^0-9] ^は含まない。 この場合数字を含まない場合マッチ
[0-9]=全ての数字 [a-zA-Z]=全てのアルファベット console.log("D".match(/[BCD]/)); //->[ 'D', index: 0, input: 'D', groups: undefined ] JavaScript Python php GO |
[^ ] | 角括弧内に含まれる文字以外のどれか1つにマッチ。
console.log("test1test2".match(/[^abc]/)); //->[ 't', index: 0, input: 'test1test2', groups: undefined ] console.log("test1test2".match(/[^abc]/g)); //->[ 't', 'e', 's', 't', '1', 't', 'e', 's', 't', '2' ] JavaScript Python php GO |
( ) ・グルーピング ・記憶装置 | 文字列で評価
(yahoo)+とするとyahooが()内を一つのパターンとしてマッチ。
/(abc)(123)/:abcと123があればマッチ
/(abc)+(123)/:abcが一回以上の後に123が続けばマッチ
また()は記憶装置であり、()内と一致したものは、変数$1、$2...に受け渡せる。 JavaScript Python php GO |
(?:x) | 非キャプチャーグループ xにマッチするが、記憶しないので、結果の配列にもマッチ文字は含まれないし、$1で呼び出せない。 JavaScript Python php GO |
(?<Name>x) | 名前付きキャプチャーグループ xにマッチし、結果の配列のgroupsにName格納される。 var result = /(? JavaScript Python php GO |
x(?=y) | 肯定先読み xにyが続く時、xの部分だけ取り出す。 JavaScript Python php GO |
(?<=y)x | 肯定後読み yにxが続く時、xの部分だけ取り出す。 JavaScript Python php GO |
x(?!y) | 否定先読み xにyが続かない時、xの部分だけ取り出す。 var result = /\d+(?!\.)/.exec("12.345"); console.log(result); //->[ '141', index: 2, input: '3.141', groups: undefined ] JavaScript Python php GO |
(?<!y)x | 否定後読み yにxが続かない時、xの部分だけ取り出す。 /(?<-)\d+/はマイナスの数字にはマッチしません。 JavaScript Python php GO |
{ } | 直前の文字か[...]か(...)が回数分繰り返すものにマッチ {n}:n回分 [n,}:n回以上 {n,m}:n~m回の場合 console.log("20220303".match(/[0-9]{8}/)); //->[ '20220303', index: 0, input: '20220303', groups: undefined ] console.log("20220303".match(/[0-9]{8}/).length); //->1 console.log("20220303".match(/[0-9]{9}/)==null); //->true JavaScript Python php GO |
*? +? ?? {n,m}? | 最短マッチconsole.log("<12><34><56>".match(/<.*>/)); //-><12><34><56> 最長 console.log("<12><34><56>".match(/<.*?>/)); //-><12> 最短 console.log("<12><34><56>".match(/<.+>/)); //-><12><34><56> 最長 console.log("<12><34><56>".match(/<.+?>/)); //-><12> 最短 console.log("123456".match(/23?/)); //->23 最長 console.log("123456".match(/23??/)); //->2 最短 console.log("GGGGGG".match(/G{2,4}/)); //->GGGG 最長 console.log("GGGGGG".match(/G{2,4}?/)); //->GG 最短 JavaScript Python php GO |
\(エスケープシーケンス) | .*?$^+等は正規化記号で使われているので、これらの記号を文字としてマッチさせる場合に、\?等とすると、"?"(クエスチョンマーク)文字として比較できる。 ・制御 ・メタ文字 ・定義済表現 ・Unicode など JavaScript Python php GO |
\(制御) | \0:null \x00 \b:back space:\x08 \t:tab:\x09 \f:form feed:\x0C) \r:carriag return:\x0D \n:line feed:\x0A :改行 \v:vertical tab:\x0B JavaScript Python php GO |
\(制御) | \c:escape:\x1B \cX: Ctrl+X JavaScript php |
\XXX \xXX | \XXX:8進数 \106='F' \xXX:16進数 \x46='F' \x20 : 半角スペース(x20はASCIIコード0x20) JavaScript Python php GO |
\ (メタ文字) | 後ろの文字列で特殊な意味を持つ \^:hut \$::ドル \.:ピリオド \+:プラス \*:アスタリスク \/:スラッシュ \\:バックスラッシュ \[ \]:括弧 \{ \}:括弧 \( \):括弧 \l : 半角英小文字(エル) JavaScript Python php GO |
\定義済表現 | \d : 半角数字 \D:\d以外の文字 \d+ : 数字列 \d{3} : 3桁数字 \d{3,} : 3桁以上の数字 \d{1,10} : 1~10桁の最長の数字 \s:空白文字[\t\f\r\n\v] \w:_を含む英数文字[a-zA-Z0-9_] \W:\w以外の文字 JavaScript Python php GO |
\uXXXX | \u:Unicode(16進数) JavaScript Python |
\b \B | /\babc/:独立したword 'abc'が先頭か末尾である場合マッチ。 /\Babc/:'abc'が先頭でも末尾でもない場合マッチ。 //:間の文字(改行含まない) JavaScript Python php GO |
! | マッチしない場合に条件成立。 =の反対。 !^localhost(?::\d+)?$ の様に先頭に付けると、それ以降にマッチしない場合に条件成立となる。 \dは半角数字。 \d+ 半角数字を1個以上。 JavaScript Python php GO |
ABC | "ABC"の文字列と最初に一致した部分とマッチする。 JavaScript Python php GO
|
\d{3}-?\d{4} | \d{3}-?\d{4}:数字3桁と-と数字4桁でマッチ。 郵便番号など。
?:直前文字0か1 JavaScript Python php GO |
\d+ [+-]?\d+ | 数字1桁以上 数字1桁以上と符号あってもなくてもOK。 JavaScript Python php GO |
([a-z] {2,} [0-9] {3,5}) | 半角英子文字2文字以上で数字が3~5桁 ([a-z] {2,} \d{3,5})でも良い。 JavaScript Python php GO |
(info|warn|error) | "info"、"warn"、または "error"。 JavaScript Python php GO |
(.+) | (.+):任意の文字1文字以上 JavaScript Python php GO |
(.+)-\1 | (.+):任意の文字1文字以上があり、 -:-があり、 \1:(.+)で見つけた文字と同じ文字がある場合にマッチ。 \1は(.+)で記憶された内容を変数で表す。出力に使う$1や$2と同じ。 \1や\2はマッチの時に使う。 JavaScript Python php GO |
^abc | 文字列が先頭からabcで始まる。 //:文字列 ^::先頭 JavaScript Python php GO |
a....0 | aで始まり0で終わって間に改行以外で4文字ある文字列。 //:文字列(改行含まない) .:改行以外の任意の一文字 JavaScript Python php GO |
a.0 a.*0 a.+z | /a.0/:aで始まり0で終わる3文字とマッチ /a.*0/:aで始まり0で終わる2文字以上でマッチ /a.+z/:aで始まりzで終わる3文字以上とマッチ JavaScript Python php GO |
[^0-9] [^A-Za-z_] | 数字以外の1文字 半角英文字以外の1文字 JavaScript Python php GO |
Email アドレス (RFC準拠ではない) | ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ |
URL | ^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
ドメイン名 | ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z-]{2,}$ |
固定電話番号 | ^0\d(-\d{4}|\d-\d{3}|\d\d-\d\d|\d{3}-\d)-\d{4}$ |
携帯電話番号 | ^0[789]0-\d{4}-\d{4} |
IP 電話番号 | ^050-\d{4}-\d{4}$ |
フリーダイヤル | ^(0120|0800)-\d{3}-\d{3}$ |
日付 (YYYY-MM-DD形式) | ^\d{4}-\d\d-\d\d$ |
郵便番号 | ^\d{3}-\d{4}$ |
カタカナ 全角カタカナ 半角カタカナ | ^[ァ-ンァ-ン゙゚]*$ ^[ァ-ン]*$ ^[ァ-ン゙゚]*$ |
おまけ RFC5322準拠 e-mailアドレス正規表現
99.99%のe-mailアドレス正規表現が『emailregex.com』に載っていました。 長すぎて何が何だか解読する気も起こりません。
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
コメント