正規表現による文字列置換 - 正規表現
正規表現による文字列の置換についての説明です。
文字、文字列の置換
単一文字の置換
置換パターン、置換文字列に単一文字を指定すると、パターンの文字を置換文字列の文字に置換できます。
入力 | 置換パターン | 置換文字列 | 結果 |
ペンギン | ぺ | ポ | ポンギン |
ペンギン | ン | タ | ペタギタ |
単一文字のパターンを複数文字に置換
置換パターンに単一文字、置換文字列に文字列を指定すると、パターンの文字を置換文字列に置換できます。
入力 | 置換パターン | 置換文字列 | 結果 |
トナカイ | ナ | ノサマ | トノサマカイ |
山から海へ | 海 | 湖沼 | 山から湖沼へ |
文字列を文字列に置換
置換パターンに置換文字列、置換文字列に文字列を指定すると、パターンの文字列を置換文字列に置換できます。
入力 | 置換パターン | 置換文字列 | 結果 |
米国疾病管理予防センター | 米国 | アメリカ | アメリカ疾病管理予防センター |
グランドキャニオン | グランド | アンテロープ | アンテロープキャニオン |
文字列を削除
置換パターンに置換文字列、置換文字列に空文字を指定すると、パターンの文字列を削除できます。
入力 | 置換パターン | 置換文字列 | 結果 |
独自低消費電力ディスプレイ | 低消費電力 | | 独自ディスプレイ |
2013-06-04 | 2013\- | | 06-04 |
文字、記号のエスケープ
以下の文字、記号は正規表現で予約されている文字のためエスケープする必要があります。正規表現でのエスケープは文字の前に"\"文字を付加します。
エスケープ文字 | エスケープ後の書式 | 意味 |
\ | \\ | エスケープ文字 |
* | \* | 任意の個数 |
+ | \+ | 1個以上の個数 |
. | \. | 任意の文字 |
? | \? | 個数0または1 |
( | \( | グループ 開始 |
) | \) | グループ 終了 |
{ | \{ | 繰り返しマッチグループ 開始 |
} | \} | 繰り返しマッチグループ 終了 |
[ | \[ | 選択グループ 開始 |
] | \] | 選択グループ 終了 |
^ | \^ | 行頭に一致 / 否定 |
$ | \$ | 行末に一致 |
- | \- | 範囲を表す |
| | \| | いずれかの文字列 |
ワイルドカード
任意の文字 - 1文字の任意文字 "."
正規表現では"."で1文字分のワイルドカードを表現します。
入力 | 置換パターン | 置換文字列 | 結果 |
みかん | み.ん | りんご | りんご |
みつかん | み.ん | りんご | みつかん |
みりんかん | み.ん | りんご | りんごかん |
みつよかん | み.ん | りんご | みつよかん |
上記の例ではパターンが"み.ん"のため「み」で始まり、「ん」で終わる3文字の文字列に一致します。上記では「みかん」「みりん」がマッチするパターンになるため、これらが「りんご」に置換されます。
いずれかの文字 "[]"
文字を[]で囲むことでいずれかの文字に一致するパターンを記述できます。
入力 | 置換パターン | 置換文字列 | 結果 |
ABCD8EFG | [0123456789] | num | ABCDnumEFG |
Z2PP | [0123456789] | num | ZnumPP |
460 | [0123456789] | num | numnumnum |
上記の例では"[0123456789]"としたことで、0,1,2,3,4,5,6,7,8,9 の数値があった場合にnumに置換する動作となります。
一般的な記述
- "[0123456789]"のパターンは一般的には"[0-9]"と記述できます。
- "[abcdefghijklmnopqrstuvwxyz]"のパターンは一般的には"[a-z]"と記述できます。
- "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]"のパターンは一般的には"[A-Z]"と記述できます。
定義されている略記 "\d" "\s" "\w" / メタ文字
以下の省略記述のメタ文字が定義されています。
書式 | 同等の正規表現式 | 意味 |
\d | [0-9] | 数値のパターンを表します |
\s | [\f\n\r\t\v] | スペース、タブなどの空白文字のパターンを表します |
\w | [a-zA-Z_0-9] | 大文字、小文字のアルファベット、数値、アンダースコアのパターンを表します |
\D | [^0-9] | 数値以外の文字のパターンを表します |
\S | [^\f\n\r\t\v] | スペース、タブなどの空白文字以外の文字のパターンを表します |
\W | [^a-zA-Z_0-9] | 大文字、小文字のアルファベット、数値、アンダースコア以外の文字のパターンを表します |
制御文字のメタ文字
書式 | 同等の文字 | 意味 |
\r | \u000D | キャリッジリターン |
\n | \u000A | ラインフィード |
\t | \u0009 | タブ |
\b | \u0009 | タブ |
\a | \u0008 | バックスペース |
\v | \u000B | 垂直タブ |
\f | \u000C | フォームフィード |
\e | \u001B | エスケープ文字(1B) |
\ | | メタ文字を無効にする ("\." でピリオド文字を表現) |
Unicodeカテゴリ、Unicodeブロックの指定
書式 | 意味 |
\p{name} | "name"で指定したUnicode カテゴリ、ブロックの文字のパターンを表します |
\P{name} | "name"で指定したUnicode カテゴリ、ブロックの文字以外の文字のパターンを表します |
具体例
書式 | 意味 |
\p{Hiragana} | ひらがな文字 |
\p{Katakana} | カタカナ文字 |
\p{Han} | 漢字文字 |
ASCII/Unicode文字の指定
書式 | 意味 |
\u[nnnn] | 4桁の16進数で表現されるUnicode文字 |
\x[nn] | 2桁の16進数で表現されるASCII文字 |
\[nnn] | 2桁または3桁の8進数で表現されるUnicode文字 |
個数表現、繰り返し
指定した回数(n)の文字数、繰り返し "{n}"
n文字を表現する場合は、パターンを複数記載します。または "{(個数)}"と記述します。
例
入力 | 置換パターン | 置換文字列 | 結果 |
[BOOK(PHOTO)] 2001-04 # ABC | \[BOOK\(PHOTO\)\] [0-9]{4}-[0-9]{2} # | PhotoDate | PhotoData ABC |
[BOOK(PHOTO)] 2001-01 # あいう | \[BOOK\(PHOTO\)\] [0-9]{4}-[0-9]{2} # | PhotoDate | PhotoData あいう |
[BOOK(PHOTO)] 01-04 # | \[BOOK\(PHOTO\)\] [0-9]{4}-[0-9]{2} # | PhotoDate | [BOOK(PHOTO)] 01-04 # |
指定した回数(n)以上の文字数、繰り返し "{n,}"
n文字以上を表現する場合は、 "{(個数),}"と記述します。
指定した回数(n)以上、(m)以下の文字数、繰り返し "{n,m}"
n文字以上かつm文字以下を表現する場合は、 "{(下限個数),(上限個数)}"と記述します。
参考:n文字の任意文字 "..." ".{n}"
任意文字をn文字表現する場合は"."を複数記述します。
入力 | 置換パターン | 置換文字列 | 結果 |
ホトトギス | ホ..ギ | ヤモモモズ | ヤモモモズス |
アメホシスギル | ホ..ギ | サメ | アメサメル |
上記の例ではパターンが"ホ..ギ"のため「ホ」で始まり、「ギ」で終わる4文字の文字列に一致します。上記では「ホトトギ」「ホシスギ」がマッチするパターンになるため、これらが「ヤモモモズ」や「サメ」に置換されます。
別の記述方法として".{(個数)}"と記述する方法もあります。
入力 | 置換パターン | 置換文字列 | 結果 |
すももももの木 | す.{3} | ま | まもの木 |
1つ以上の文字数 "+"
1文字以上の任意の文字数を表現する場合は
+
を利用します。
任意の個数の文字数 "*"
任意の文字数を表現する場合は
*
を利用します。
参考:任意個数の任意文字 ".*"
任意個数の任意文字を置換する場合は ".*" を記述します。
入力 | 置換パターン | 置換文字列 | 結果 |
ニホンムラサキカモシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンクロカモシカ |
ニホンアカカモシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンクロカモシカ |
ニホンサンガクカモシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンクロカモシカ |
ニホンキミドリカモシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンクロカモシカ |
ニホンイワトビカモシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンクロカモシカ |
ニホンカモシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンクロカモシカ |
ニホンシカ | ニホン.*カモシカ | ニホンクロカモシカ | ニホンシカ |
カモシカ | ニホン.*カモシカ | ニホンクロカモシカ | カモシカ |
上記の例ではパターンが"ニホン.*カモシカ"のため「ニホン」で始まり、「カモシカ」で終わるすべての文字列対して、ニホンクロカモシカへ置換します。
1つまたは0個の文字数 "?"
1つまたは0個の文字数を表現する場合は
?
を利用します。
"Penguins?"により、"Penguin", "Penguins" のどちらにもマッチします。
入力 | 置換パターン | 置換文字列 | 結果 |
PenguinsHeaven | Penguins? | ぺんぎん | ぺんぎんHeaven |
PenguinHeaven | Penguins? | ぺんぎん | ぺんぎんHeaven |
最短一致 "?"
正規表現では指定しない場合、パターンにマッチする最長の文字列を検出します。
パターンにマッチする最短の文字列を検出する場合は、個数の表現、またはブロックに続けて"?"を記述します。
文字列の先頭 "^"
文字列の先頭を指定する場合には
^
を記述します。
"^りんご" のパターンでは、文字列の先頭の「りんご」にはマッチしますが、文字列中の「りんご」にはマッチしません。
入力 | 置換パターン | 置換文字列 | 結果 |
りんごが美味しい | ^りんご | Apple | Appleが美味しい |
みかんとりんごが美味しい | ^りんご | Apple | みかんとりんごが美味しい |
文字列の末尾 "$"
文字列の末尾を指定する場合は、
$
を記述します。
"クッキー$" のパターンでは、文字列の末尾の「クッキー」にはマッチしますが、文字列中や先頭の「クッキー」にはマッチしません。
入力 | 置換パターン | 置換文字列 | 結果 |
ぺんぎんクッキー | クッキー$ | Cookie | ぺんぎんCookie |
チョコクッキーアイス | クッキー$ | Cookie | チョコクッキーアイス |
いずれかの文字列 "|"
文字列を"|"で区切ることでいずれかの文字列に一致するパターンを記述できます。
入力 | 置換パターン | 置換文字列 | 結果 |
りんごが美味しい | りんご|メロン|スイカ|ブドウ | 果物 | 果物が美味しい |
みかんが美味しい | りんご|メロン|スイカ|ブドウ | 果物 | みかんが美味しい |
メロンが美味しい | りんご|メロン|スイカ|ブドウ | 果物 | 果物が美味しい |
スイカが美味しい | りんご|メロン|スイカ|ブドウ | 果物 | 果物が美味しい |
ブドウが美味しい | りんご|メロン|スイカ|ブドウ | 果物 | 果物が美味しい |
"りんご"、"メロン"、"スイカ"、"ブドウ"の文字列が"果物"に置換されます。
いずれかの文字列を含むパターン "()"
"|"で区切ったパターンを一部に含む場合は"()"でくくりグループ化します。
入力 | 置換パターン | 置換文字列 | 結果 |
りんごが美味しい | (りんご|みかん|いよかん|夏みかん|メロン|梨)が | 果物が | 果物が美味しい |
みかんは美味しい | (りんご|みかん|いよかん|夏みかん|メロン|梨)が | 果物が | みかんは美味しい |
いよかんが美味しい | (りんご|みかん|いよかん|夏みかん|メロン|梨)が | 果物が | 果物が美味しい |
夏みかんは美味しい | (りんご|みかん|いよかん|夏みかん|メロン|梨)が | 果物が | 夏みかんは美味しい |
メロンが美味しい | (りんご|みかん|いよかん|夏みかん|メロン|梨)が | 果物が | 果物が美味しい |
梨は美味しい | (りんご|みかん|いよかん|夏みかん|メロン|梨)が | 果物が | 梨は美味しい |
"りんご"、"みかん"、 "いよかん"、"夏みかん"、"メロン"、"梨"に続けて"が"の文字があった場合に、"果物が"に置換されます。
("りんごが"、"みかんが"、 "いよかんが"、"夏みかんが"、"メロンが"、"梨が"の文字列が"果物が"に置換されます。)
パターンの取り出し - グループ (変数的な扱い)
置換パターンを"(" ")"で囲むとマッチした場合にグループとして参照できます。グループとして定義すると元の入力を変数のように扱うことができます。参照する際は最初のグループが"$1"以降"$2","$3","$4"......となります。
例1 : 単純な例
かっこに囲まれた1桁の数値の頭に"0"を追加して2桁に揃えます
入力 | 置換パターン | 置換文字列 | 結果 |
Penguin (3) | \(([0-9])\) | (0$1) | Penguin (03) |
(7) test | \(([0-9])\) | (0$1) | (07) test |
Pen (9) AA | \(([0-9])\) | (0$1) | Pen (09) AA |
例2 : yyyy/MM/dd を dd MM yyyy に変換する
入力 | 置換パターン | 置換文字列 | 結果 |
2013/08/26 | ([0-9]{4})/([0-9]{2})/([0-9]{2}) | $3 $2 $1 | 26 08 2013 |
2013/01/13 | ([0-9]{4})/([0-9]{2})/([0-9]{2}) | $3 $2 $1 | 13 01 2013 |
2011/04/18 | ([0-9]{4})/([0-9]{2})/([0-9]{2}) | $3 $2 $1 | 18 04 2011 |
例3 : クォートで囲む
入力 | 置換パターン | 置換文字列 | 結果 |
1234 | ([0-9]{4}) | "$1" | "1234" |
PEN 3389 | ([0-9]{4}) | "$1" | PEN "3389" |
20 46 1199 | ([0-9]{4}) | "$1" | 20 46 "1199" |
4ケタの数字を「"」で囲みます。
例4 : グループ名とパターンが混同する場合
入力 | 置換パターン | 置換文字列 | 結果 |
Pen18 | (Pen)([0-9]{2}) | $100$2 | $10018 |
Pen10 | (Pen)([0-9]{2}) | $100$2 | $10010 |
上記のパターンの場合、$100が文字列として認識されてしまいます。意図としては、"$1" と "00" の文字列に分割したいです。このような場合は、$の後ろのインデックス番号を中かっこで囲みます。
入力 | 置換パターン | 置換文字列 | 結果 |
Pen18 | (Pen)([0-9]{2}) | ${1}00${2} | Pen0018 |
Pen10 | (Pen)([0-9]{2}) | ${1}00${2} | Pen0010 |
${1}
により明示的にグループの値として認識できます。
パターンの取り出し - 名前付きグループ (変数的な扱い)
置換パターン内に
(?<グループ名>正規表現式)
を記述するとマッチした場合に
${グループ名}
で元の入力を変数のように扱うことができます。グループの値を置換結果に反映できます。
例1
かっこに囲まれた数値を = で囲みなおします。
入力 | 置換パターン | 置換文字列 | 結果 |
ABC(100)MNP | \((?<value>[0-9]*)\) | ==${value}== | ABC==100==MNP |
ABC(45) | \((?<value>[0-9]*)\) | ==${value}== | ABC==45== |
(45)ZZXXVV | \((?<value>[0-9]*)\) | ==${value}== | ==45==ZZXXVV |
著者
iPentecの企画・分析担当。口が悪いのでなるべく寡黙でありたいと思っている。が、ついついしゃべってしまい、毎回墓穴を掘っている。