けんおき

index

 

正規表現(regular expression)

 ※ 正規表現の記述方法については、多岐にわたるため割愛させていただきます。ご自身でお調べください。
 参考 : 正規表現言語 - クイック リファレンス

 ※ 正規表現を使用する場合は、適宜、単一行モードや複数行モードなどのインラインオプションを指定してください。 例: Singlelineの場合:「(?s)~」または「(?s:~) 」、 Multilineの場合:「(?m)~」または「(?m:~)」(“~”は正規表現コード)
 改行を含む文字列の場合は、改行コードも考慮する必要があります。Windows の改行コードは、「\r\n」ですので、「$」は「\n」の前にも文字列の末尾(行末)にも一致しますが、「\r\n」には一致しないことに注意してください。一致させるには、「$」は「\r?$」を正規表現パターンに含めてください。同様に、「\Z」の場合も「\r?\Z」を正規表現パターンに含めてください。

 

 ※ 記号「\」は、フォントによって「¥(円マーク)」または「\(バックスラッシュ)」が表示されます。

 


 
 

⫸ 正規表現(regular expression)とは

 文字列の中から特定のパターンに一致する部分を検索したり、置き換えたりするための、一連のルールが定められたパターンマッチのための一種の言語です。 正規表現では、色々な記号が特殊な意味を持ちます。

 「Aで始まる文字列」、「ABCを含む文字列」、「郵便番号、URL、E-MAIL」のような決まった形式の文字列など、文字列が指定したパターンにマッチしているかどうかを抽出(検索)することができます。

 「日付のフォーマットの変更」「行頭へ引用記号を挿入」「HTML形式のテキストからタグを除去、変更」など、パターンにマッチした置き換えもできます。

 

例:
.et pet、set、get のような三文字の文字列にマッチします。
[pg]et pet と get にマッチします。
[^s]et set 以外の ".et" でマッチする全ての文字列にマッチします。
^[sg]et 行の最初にあるときだけ、set と get にマッチします。
[sg]et$ 行の最後にあるときだけ、set と get にマッチします。
0x[a-fA-F0-9]+ 先頭が0xで、続く文字がa-f、またはA-F、または0-9の文字が一つ以上続く文字列にマッチします。
[\t ] タブと空白にマッチします。
^[a-zA-Z0-9].* 行頭が英数字の文字列にマッチします。

 

サンプル:検索
検索パターン
A で始まる文字列(?m)^A
末尾が .a の文字列(?m)\.a$
(?m)\.a\r?$
AからCまでの2桁以上の文字列A.*C
(?s)A.*C
単一行モードでは、間に改行を含んでいてもマッチします。
ABCから始まる行(?m)^ABC.+
ABCを含む文字列(1行)(?m)^.*ABC.*
ABCを含む文字列(1行)
ABCのみの行は一致しない。前後に1文字以上が必要。
(?m)^.+ABC.+
ABCが含まれていない文字列(1行)
空の行も一致する。
(?m)^(?!.*ABC).*
先頭からABCまで(?m)^.*ABC
先頭からABCまで
ABCの前に1文字以上が必要。
(?m)^.+ABC
ABCで終わる行(?m)^.*ABC$
(?m)^.*ABC\r?$
ABCで終わる行
ABCの前に1文字以上が必要。
(?m)^.+ABC$
(?m)^.+ABC\r?$
「明日」または「あす」または「あした」または「みょうにち」明日|あす|あした|みょうにち
半角文字のみの行(?m)^[ -~。-゚]+$
(?m)^[ -~。-゚]+\r?$
半角文字列[ -~。-゚]+
半角カタカナ文字列[\uFF61-\uFF9F]+
全角カタカナ文字列[ァ-ヶー ]+
全角英大文字列[A-Z]+
全角数字[0-9]
ダブルクォーテーション囲み\".+?\"
(?s)\".+?\"
単一行モードでは、間に改行を含んでいてもマッチします。
【】で囲まれた中身だけをマッチする(?<=【).*?(?=】)
(?s)(?<=【).*?(?=】)
単一行モードでは、間に改行を含んでいてもマッチします。
URLhttp(s)?://[\w/:%#\$&\?\(\)~\.=\+\-]+
メールアドレス(E-MAIL)[\w.\-]+@[\w\-]+\.[\w.\-]+

 

サンプル:検索・置き換え
検索パターン置き換えパターン
郵便番号
「012-3456」
\d{3}-\d{4}
[0-9]{3}-[0-9]{4}
郵便番号の前に「〠」を挿入
「〠012-3456」
〠$0
郵便番号
「1234567」
(\d{3})(\d{4})郵便番号の前に「〒」を挿入、間に「-」を挿入
「〒123-4567」
〒$1-$2
電話番号
「012-345-6789」
(0\d{1,4})-(\d{1,4})-(\d{4})電話番号の局番を( )で囲む
「012(345)6789」
$1($2)$3
携帯電話番号
「090-8765-4321」
0[789]0-\d{4}-\d{4}携帯電話番号の前に「☏」、後ろに「📱」を挿入
「☏090-8765-4321📱」
☏$0📱
携帯電話番号(ハイフンなし)
「09087654321」
0[789]0\d{8}
(0[789]0)(\d{4})(\d{4})ハイフンを挿入
「090-8765-4321」
$1-$2-$3
「2020/10/22」、「20/10/22」形式の日付((?:\d\d)?\d\d)/(\d\d?)/(\d\d?)「10-22-2020」、「10-22-20」形式の日付$2-$3-$1
(?<year>(?:\d\d)?\d\d)/(?<month>\d\d?)/(?<day>\d\d?)「2020年10月22日」、「20年10月22日」形式の日付${year}年${month}月${day}日
「2020年10月22日」、「20年10月22日」形式の日付((?:\d\d)?\d\d)年(\d\d?)月(\d\d?)日「[10/22/2020]」、「[10/22/20]」形式の日付[$2/$3/$1]
(?<year>(?:\d\d)?\d\d)年(?<month>\d\d?)月(?<day>\d\d?)日[${month}/${day}/${year}]
「03/09/12」、「3/9/2」形式の日付(\d\d?)/(\d\d?)/(\d\d?)「㋿03年09月12日」、「㋿3年9月2日」形式の日付㋿$1年$2月$3日
「10時~19時」形式の時間((\d{1,2})時~(\d{1,2})時)「10:00-19:00」形式の時間$2:00-$3:00
「\12,345」、「¥12,345」
先頭の「¥(円マーク)」を削除して末尾に「円」を付加
\\(\d{1,3}(,\d{3})*)\b
¥(\d{1,3}(,\d{3})*)\b
「12,345円」、「12,345円」$1円
「12,345円」、「12,345円」
末尾の「円」を削除して先頭に「¥(円マーク)」を付加
(\d{1,3}(,\d{3})*)円\b「\12,345」
「¥12,345」
\$1
¥$1
「1234567890」、「1234567890」
数字3ケタおきにカンマを挿入
\B(?=(\d{3})+(?!\d))「1,234,567,890」
「1,234,567,890」
,(半角)
,(全角)

 
 

⫸ 正規表現(regular expression) 「参考」

 

パターン

パターン 意味
x 文字xをマッチします
. 改行を除いた全ての文字をマッチします
[xyz] 文字xとyとzをマッチします
[a-z] 文字aからzをマッチします
[^a-z] 文字aからz以外をマッチします
r* 正規表現rが連続で0かそれ以上続いた場合にマッチします
r+ 正規表現rが連続で1かそれ以上続いた場合にマッチします
r? 正規表現rが連続で0か1つ続いた場合にマッチします
r{n1,n2} 正規表現rが連続でn1~n2個続いた場合にマッチします
r{n,} 正規表現rが連続でn以上続いた場合にマッチします
r{n} 正規表現rが連続でn個続いた場合にマッチします
\x エスケープシーケンスコード、またはつつく文字自体をマッチします
(r) パターンマッチの優先順位を変更します
r|s 正規表現rまたは正規表現s
^s 行頭の正規表現s。[]中の^とは意味が異なるので注意
s$ 行末の正規表現s

 

エスケープ文字

正規表現内の円記号 (\) は、直後の文字が特殊文字 (次の表を参照) であるか、文字どおりに解釈する必要があることを示します。

エスケープ文字 説明
\a ビープ音文字の \u0007 と一致します。
\b 文字クラスでバックスペースの \u0008 と一致します。
\t タブの \u0009 と一致します。
\r キャリッジ リターンの \u000D と一致します。 \r は改行文字の \n とは異なります。
\v 垂直タブの \u000B と一致します。
\f フォーム フィードの \u000C と一致します。
\n 改行文字の \u000A と一致します。
\e エスケープ文字の \u001B と一致します。
\ nnn 文字を指定する、8 の表示 (nnn 2 または 3 桁で構成されます)。
\x nn 16 進数表現で文字を指定します (nn は 2 桁で構成されます)。
\c X
\c x
X または x で指定された ASCII の制御文字と一致します。X または x は制御文字です。
\u nnnn 16 進数形式で表される Unicode 文字 (nnnn で表される 4 桁の数字) と一致します。
\ このトピック内の表に示されているエスケープ文字として認識されない文字が後ろに付いている場合は、その文字と一致します。 たとえば、\* は \x2Aと同じであり、\. は \x2Eと同じです。 これを使用すると、正規表現エンジンによって言語要素 (* や ? など) と文字リテラル (\* や \? など) のあいまいさが解消されます。

 

文字クラス

文字クラスは、文字セットのいずれかと一致します。

文字クラス 説明
[ character_group ] character_group 内の任意の 1 文字と一致します。 既定では、大文字と小文字が区別されます。
[^ character_group ] 否定: character_group 内にない任意の 1 文字と一致します。 既定では、character_group 内で大文字と小文字が区別されます。
[ first - last ] 文字範囲: first から last までの範囲にある任意の 1 文字と一致します。
. ワイルドカード: \n を除く任意の 1 文字と一致します。
リテラルの期間の文字と一致する (。 または \u002E) は、エスケープ文字 (\.) と、その前に指定する必要があります。
\p{ name } name で指定された Unicode 一般カテゴリまたは名前付きブロック内の任意の 1 文字と一致します。
\P{ name } name で指定された Unicode 一般カテゴリまたは名前付きブロックにない任意の 1 文字と一致します。
\w 単語に使用される任意の文字と一致します。
\W 単語に使用される文字以外の任意の文字と一致します。
\s 空白文字と一致します。
\S 空白以外の文字と一致します。
\d 10 進数字と一致します。
\D 10 進数以外の文字と一致します。

 

アンカー (アトミック ゼロ幅アサーション)

アンカー (アトミック ゼロ幅アサーション) を使用すると、文字列内での現在位置によって一致するかどうかが決まります。しかし、後方の文字列が読み込まれたり、複数の文字と一致したりすることはありません。

アサーション 説明
^ 文字列または行の先頭で一致する必要があります。
$ 文字列の末尾で一致するか、行または文字列の末尾にある \n の前で一致する必要があります。
\A 文字列の先頭で一致する必要があります。
\Z 文字列の末尾で一致するか、文字列の末尾にある \n の前で一致する必要があります。
\z 文字列の末尾で一致する必要があります。
\G 前回の一致が終了した位置で一致する必要があります。
\b \w (英数字) と \W (英数字以外) 文字の境界位置で一致する必要があります。
\B \b 境界以外で一致する必要があります。

 

グループ化構成体

グループ化構成体は、正規表現の部分式を表し、通常は入力文字列の部分文字列をキャプチャします。

グループ化構成体 説明
( subexpression ) 一致した部分式をキャプチャして、0 から始まる序数を代入します。
(?< name > subexpression )
または
(?' name ' subexpression )
一致した部分式を名前付きグループにキャプチャします。
(?< name1 - name2 > subexpression )
または
(?' name1 - name2 ' subexpression )
グループ定義の均等化を定義します。
(?: subexpression ) 非キャプチャ グループを定義します。
(?imnsx-imnsx: subexpression ) 指定したオプションを subexpression に適用するか、または無効にします。
(?= subexpression ) ゼロ幅の肯定先読みアサーションです。
(?! subexpression ) ゼロ幅の否定先読みアサーションです。
(?<= subexpression ) ゼロ幅の正の後読みアサーションです。
(?<! subexpression ) ゼロ幅の負の後読みアサーションです。
(?> subexpression ) 非バックトラッキング ("最長") 部分式です。

 

量指定子

量指定子は、一致するために、入力文字列中に直前の要素 (文字、グループ、または文字クラス) がいくつ存在しなければならないかを指定します。

量指定子 説明
* 直前の要素と 0 回以上一致します。
+ 直前の要素と 1 回以上一致します。
? 直前の要素と 0 回または 1 回一致します。
{ n } 直前の要素とちょうど n 回一致します。
{ n ,} 直前の要素と n 回以上一致します。
{ n , m } 直前の要素と n 回以上 m 回以下一致します。
*? 直前の要素と 0 回以上 (ただし、できるだけ少ない回数) 一致します。
+? 直前の要素と 1 回以上 (ただし、できるだけ少ない回数) 一致します。
?? 直前の要素と 0 回または 1 回 (ただし、できるだけ少ない回数) 一致します。
{ n }? 直前の要素とちょうど n 回一致します。
{ n ,}? 直前の要素と n 回以上 (ただし、できるだけ少ない回数) 一致します。
{ n , m }? 直前の要素と n 回以上 m 回以下 (ただし、できるだけ少ない回数) 一致します。

 

前方参照構成

前方参照を使用すると、以前に一致した部分式を、同じ正規表現内で引き続き識別できます。

前方参照構成体 説明
\ number 前方参照。 番号付き部分式の値に一致します。
\k< name > 名前付き前方参照。 名前付きの式の値に一致します。

 

代替構成体

代替構成体は、OR 一致を有効にするように正規表現を変更します。 これらの構成体に含まれる言語要素を次の表に示します

代替構成体 説明
| 縦棒 (|) 文字で区切られた要素のいずれかと一致します。
(?( expression ) yes | no ) 式 で表される正規表現パターンが一致する場合 ○ に一致します; それ以外 [いいえ] の省略可能な要素。 expression はゼロ幅アサーションとして解釈されます。
(?( name ) yes | no ) 名前の名前付きまたは番号付きのキャプチャ グループに一致する場合、○ に一致します; それ以外の場合、検索オプションの [いいえ]。

 

置換

文字 説明 パターン 置換パターン 入力文字列 結果文字列
$ 番号 グループ番号 number と一致した部分文字列に置換されます。 \b(\w+)(\s)(\w+)\b $3$2$1 "one two" "two one"
${ 名前 } 名前付きグループ name と一致した部分文字列に置換されます。 \b(?<word1>\w+)(\s)(?<word2>\w+)\b ${word2} ${word1} "one two" "two one"
$$ "$" リテラルに置換されます。 \b(\d+)\s?USD $$$1 "103 USD" "$103"
$& 一致したパターン全体と同じパターンに置換されます。 (\$*(\d*(\.+\d+)?){1}) **$& "$1.30" "**$1.30**"
$` 一致した場所より前にある入力文字列のすべてに置換されます。 B+ $` "AABBCC" "AAAACC"
$' 一致した場所より後にある入力文字列のすべてに置換されます。 B+ $' "AABBCC" "AACCCC"
$+ キャプチャされた最後のグループに置換されます。 B+(C+) $+ "AABBCCDD" AACCDD
$_ 入力文字列全体に置換されます。 B+ $_ "AABBCC" "AAAABBCCCC"

 

正規表現のオプション

オプション 説明
i 大文字と小文字を区別しない一致を使用します。
m 複数行モードを使用します。 ^ と $ は文字列の先頭および末尾ではなく行の先頭および末尾と一致します。
n 名前のないグループをキャプチャしません。
s 単一行モードを使用します。
x 正規表現パターンのエスケープされていない空白を無視します。