正規表現による文字列置換 - 正規表現

正規表現による文字列の置換についての説明です。
正規表現 文字列置換Webアプリ
正規表現の文字列置換Webアプリはこちらです。

文字、文字列の置換

単一文字の置換

置換パターン、置換文字列に単一文字を指定すると、パターンの文字を置換文字列の文字に置換できます。
入力置換パターン置換文字列結果
ペンギンポンギン
ペンギンペタギタ

単一文字のパターンを複数文字に置換

置換パターンに単一文字、置換文字列に文字列を指定すると、パターンの文字を置換文字列に置換できます。
入力置換パターン置換文字列結果
トナカイノサマトノサマカイ
山から海へ湖沼山から湖沼へ

文字列を文字列に置換

置換パターンに置換文字列、置換文字列に文字列を指定すると、パターンの文字列を置換文字列に置換できます。
入力置換パターン置換文字列結果
米国疾病管理予防センター米国アメリカアメリカ疾病管理予防センター
グランドキャニオングランドアンテロープアンテロープキャニオン

文字列を削除

置換パターンに置換文字列、置換文字列に空文字を指定すると、パターンの文字列を削除できます。
入力置換パターン置換文字列結果
独自低消費電力ディスプレイ低消費電力独自ディスプレイ
2013-06-042013\-06-04

文字、記号のエスケープ

以下の文字、記号は正規表現で予約されている文字のためエスケープする必要があります。正規表現でのエスケープは文字の前に"\"文字を付加します。
エスケープ文字エスケープ後の書式意味
\\\エスケープ文字
*\*任意の個数
+\+1個以上の個数
.\.任意の文字
?\?個数0または1
(\(グループ 開始
)\)グループ 終了
{\{繰り返しマッチグループ 開始
}\}繰り返しマッチグループ 終了
[\[選択グループ 開始
]\]選択グループ 終了
^\^行頭に一致 / 否定
$\$行末に一致
-\-範囲を表す
|\|いずれかの文字列

ワイルドカード

任意の文字 - 1文字の任意文字 "."

正規表現では"."で1文字分のワイルドカードを表現します。
入力置換パターン置換文字列結果
みかんみ.んりんごりんご
みつかんみ.んりんごみつかん
みりんかんみ.んりんごりんごかん
みつよかんみ.んりんごみつよかん

上記の例ではパターンが"み.ん"のため「み」で始まり、「ん」で終わる3文字の文字列に一致します。上記では「みかん」「みりん」がマッチするパターンになるため、これらが「りんご」に置換されます。

いずれかの文字 "[]"

文字を[]で囲むことでいずれかの文字に一致するパターンを記述できます。
入力置換パターン置換文字列結果
ABCD8EFG[0123456789]numABCDnumEFG
Z2PP[0123456789]numZnumPP
460[0123456789]numnumnumnum
上記の例では"[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} #PhotoDatePhotoData ABC
[BOOK(PHOTO)] 2001-01 # あいう\[BOOK\(PHOTO\)\] [0-9]{4}-[0-9]{2} #PhotoDatePhotoData あいう
[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" のどちらにもマッチします。
入力置換パターン置換文字列結果
PenguinsHeavenPenguins?ぺんぎんぺんぎんHeaven
PenguinHeavenPenguins?ぺんぎんぺんぎんHeaven

最短一致 "?"

正規表現では指定しない場合、パターンにマッチする最長の文字列を検出します。 パターンにマッチする最短の文字列を検出する場合は、個数の表現、またはブロックに続けて"?"を記述します。

文字列の先頭 "^"

文字列の先頭を指定する場合には ^ を記述します。

"^りんご" のパターンでは、文字列の先頭の「りんご」にはマッチしますが、文字列中の「りんご」にはマッチしません。

入力置換パターン置換文字列結果
りんごが美味しい^りんごAppleAppleが美味しい
みかんとりんごが美味しい^りんご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 $126 08 2013
2013/01/13([0-9]{4})/([0-9]{2})/([0-9]{2})$3 $2 $113 01 2013
2011/04/18([0-9]{4})/([0-9]{2})/([0-9]{2})$3 $2 $118 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の企画・分析担当。口が悪いのでなるべく寡黙でありたいと思っている。が、ついついしゃべってしまい、毎回墓穴を掘っている。
掲載日: 2013-11-19
iPentec all rights reserverd.