Javascript, Python, PHP, Go 正規表現の記法と一覧

正規表現はややこしいので覚えるのが大変で、しかも言語ごとに若干異なるのでまとめました。 間違っていたらコメント頂けたらありがたいです。

言語別正規表現記法

クリックで内容が見れます。

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 = /(?.+)cde(?f)/.exec("abcdefgcdef");
console.log(result);
//->[  'abcdefgcdef',  'abcdefg', 'f',
//     index: 0,  input: 'abcdefgcdef',
//     groups: [Object: null prototype] { ichiri: 'abcdefg', osaka: 'f' }]
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....0aで始まり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])+)\])

コメント