正規表現はややこしいので覚えるのが大変で、しかも言語ごとに若干異なるのでまとめました。 間違っていたらコメント頂けたらありがたいです。
言語別正規表現記法
クリックで内容が見れます。
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])+)\])

コメント