JavaScript【 replace 】2 ~ メタ文字を使用した置換

Idea - 3d render illustration of lightbulbs  on green blackboard in a room.

String オブジェクトのreplace メソッドを使用して文字列の置換を行う場合、置換対象を指定する様々な方法があります。
今回は、メタ文字を使用したパターンで置換対象を指定する方法を紹介します。

目次

 
1.メタ文字を使用したパターン
2.エスケープ文字
3.メタ文字一覧

 

1.メタ文字を使用したパターン

 
正規表現では「+」は「加える」という意味ではなく、「1回以上の連続文字」を意味します。
このように、プログラムで、本来の意味とは異なる特別な意味を持たせた文字を、メタ文字といいます。

そして、正規表現を使う場合は、メタ文字を使って、文字のパターンを表します。

例えば、次のようなメタ文字があります。

メタ文字 意味
任意の1文字
*? 直前の文字が0文字以上続くもので、当てはまる中で最短のもの

このメタ文字でパターンを作り、次のように文字の置換を行います。

var str = "'1234','あいう','ab','',字";
var str2 = str.replace(/'.*?'/g, "A");

正規表現の後ろに記述する「 g 」は グローバルサーチという正規表現フラグで、指定した正規表現リテラルのパターンにマッチする全ての文字列を返します。
(正規表現の記述については、正規表現をご参照下さい。)

変数str2を出力すると、次のように表示されます。

 

 
メタ文字を使用して作った「 /’.*?’/g 」のパターンは、シングルコーテーションで囲まれた部分(空文字も含む)を意味しています。

「*?」で「 直前の文字が0文字以上続くもので、当てはまる中で最短のもの 」を表しますが、「*」のみの場合は、「 直前の文字が0文字以上続くもので、当てはまる中で最長のもの 」を表すので、「 var str3 = str.replace(/’.*’/g, “A”); 」として置換して、変数str3を出力すると、次のように表示されます。

 

 
「*」のみの場合は、「’1234′,’あいう’,’ab’,”」の一番外側のシングルコーテーションで囲まれている「1234′,’あいう’,’ab’,’」が、パターンが一致した置換対象とみなされます。

▲目次へ戻る

2.エスケープ文字

 
置換対象として、メタ文字自体を本来の意味で指定する場合、メタ文字の前に「 \(バックスラッシュ)」を付けて「 \* 」のように記述します。

「 \* 」は、「メタ文字ではない * 」を意味します。

この「 \ 」のように、特別な意味を無効にする文字を、エスケープ文字といいます。

▲目次へ戻る

3.メタ文字一覧

 
メタ文字には、次のような種類があります。

. 任意の1文字

例)A.B → Aから始まってBで終わる 文字数が3の文字列

* 直前のパターンの0回以上繰り返し(最長一致)

例1)ABC* → AB、ABC、ABCCC など
例2)A.*B → Aから始まってBで終わる 文字数が2以上の文字列

+ 直前のパターンの1回以上繰り返し(最長一致)

例1)ABC+ → ABC、ABCCC など
例2)A.+B → Aから始まってBで終わる 文字数が3以上の文字列

? 直前のパターンの0~1回繰り返し(最長一致)

例)ABC? → AB、ABC

~|~ |の左右の文字列のいずれか(~または~)

[~] ~のいずれか1文字

例1)[ABC] → A、B、C のいずれか
例2)[A-C] → A、B、C のいずれか
例3)[0-9] → 全角数字
例4)[A-Z]+ → 全角英大文字列
例5)[ぁ-ん] → ひらがな
例6)[ァ-ヴ] → カタカナ
例7)[ヲ-゚] → 半角カタカナ
例8)[一二三四五六七八九十壱弐参拾百千万萬億兆〇]+ → 漢数字列
例9)[0-9A-F]{2} → 0-9とA-Fのいずれかの2文字(2桁の16進数)

[^~] ~に含まれない1文字

例1)[^ABC] → A、B、C 以外の1文字
例2)[^A-C] → A、B、C 以外の1文字
例3)[^\u\l] → 半角英字以外

^ 論理行頭

例1)^○ → 行頭の○
例2)^\x20+ → 行頭の半角スペースの連続
例3)^\n → 空白行
例4)^.*$ → 行全体
例5)(置換前)^ (置換後)>\x20 → 行頭に「> 」を挿入

$ 論理行末

例1)。$ → 行末の。
例2)^.*$ → 行全体

\ 直後のメタ文字をエスケープ
(直後の文字を正規表現の記号(メタ文字)として扱わない)

例)\\ → 文字の「\」

\n 改行文字
※CR+LF(制御コード 0x0d+0x0a)とLF(制御コード 0x0a)

例1)\n → 改行
例2)^\n → 空白行
例3)(置換前)^\n (置換後)”” → 空白行を削除する

\t タブ文字(制御コード 0x09)

例1)\t → タブコード
例2)[\x20\t]+ → 半角スペースかタブコードの繰り返し
例3)(置換前)\t (置換後)\x20\x20 → タブコードを半角スペース2文字に置換

\s 空白文字(半角スペース、\t、\n、\r、\f)すべて

例)\s → 空白文字

\S 空白文字(半角スペース、\t、\n、\r、\f)以外すべて

\x## 16進数
※#は0~9、a~f、A~Fのいずれか

例1)\x41 → A
例2)\x20 → 半角スペース

\b 語の区切り位置

例)\bam\b → amという単語

\B 語の区切り位置以外

例)\Bam\B → 単語の途中にあるam

\d すべての半角数字

例1)\d → 半角数字
例2)\d+ → 数字列
例3)\d{4} → 4桁の数字
例4)\d{4,} → 4桁以上の数字
例5)\d{1,4,} → 4桁までの数字(1~4桁の数字)
例6)\d{4,10} → 4~10桁の数字(最長一致)
例7)\d{4,10}? → 4~10桁の数字(最短一致)
例8)\d*[135791]\b → 奇数
例9)\b\d{1,3}(,\d{3})*\b → 桁区切りのカンマ付数字列
例10)\\\d{1,3}(,\d{3})*\b → 価格(先頭が「\」の桁区切り付数字列)
例11)(〒|ZIP:)\d{3}-\d{4} → 郵便番号
例12)0\d{1,4}-\d{1,4}-\d{4} → 電話番号
例13)0[89]0\d{8} → 携帯電話番号(ハイフンなし)
例14)\d{4}[/\.年]\d{1,2}[/\.月]\d{1,2}日? → 日付

\D 半角数字以外すべて

例)\D → 半角数字以外

\w すべての半角英数字とアンダースコア

例1)[\w.\-]+@[\w\-]+\.[\w.\-]+ → メールアドレス
例2)https?://[\w/:%#\$&\?\(\)~\.=\+\-]+ → URL

\W 半角英数字とアンダースコア以外すべて

\l 半角英小文字すべて

例1)\l → 半角英小文字
例2)[\u\l] → 半角英字
例3)[^\u\l] → 半角英字以外
例4)\b[\u\l]+\b → 英単語
例5)[\u\l\d] → 半角英数字

\L 半角英小文字以外すべて(英大文字、数字、全角文字などすべて)

例)\L → 半角英小文字以外

\u 半角英大文字すべて

例1)\u → 半角英大文字
例2)[\u\l] → 半角英字
例3)[^\u\l] → 半角英字以外
例4)\b[\u\l]+\b → 英単語
例5)[\u\l\d] → 半角英数字

\U 半角英大文字以外すべて(英小文字、数字、全角文字などすべて)

例)\U → 半角英大文字以外

\a アラーム(制御コード 0x07)

\c# 対応するコントロール文字
※#はA-Zの半角英字のみ指定可

例)\cV → Ctrl-V

\e エスケープ(制御コード 0x1b)

\f 改ページ(制御コード 0x0c)

\r リターン(制御コード 0x0d)
※CR+LFのCR部分にはマッチしない
\v 垂直タブ(制御コード 0x0b)

\Q~\E ~部分に含まれるメタ文字をメタ文字として解釈しない
(「\」でエスケープしなくてよい)

例)\QC:\Program Files\MIW10\E → C:\Program Files\MIW10

(?i) 以降の英字の大文字と小文字を同一視する

(?-i) 以降の英字の大文字と小文字を区別する

例1)(?-i)abcd → 小文字の abcd のみ
例2)(?i)ab(?-!)cd → abcdという文字列(abは大文字小文字不問、cdは小文字のみ)

(~) ・パターンのグループ
・置換文字列に引用する部分の指定

例1)(AB)+ → AB、ABABAB など
例2)(置換前)^(.+?,)(.+?,)(.+?,.+?,)(.+?,) (置換後)\1\4\3\2 → CSVファイルの2列目と5列目を入れ替える

(?:~) パターンのグループ

例)A(?:AB|CD) → AAB、ACD

*? 直前のパターンの0回以上繰り返し(最短一致)

例1)ABC*? → AB
例2)<[hH][1-3].*?> → 見出しタグ開始(h1~h3)

+? 直前のパターンの1回以上繰り返し(最短一致)

例1)ABC+? → ABC
例2)\b[Ww]h.+?\b → whで始まる3文字以上

?? 直前のパターンの0~1回繰り返し(最短一致)

例)ABC?? → AB

{min,max} 直前のパターンのmin回からmax回繰り返し(最長一致)

例1)ABC{3,5} → ABCCC、ABCCCC、ABCCCCC
例2)0\d{1,4}-\d{1,4}-\d{4} → 電話番号
例3)\d{4}[/\.年]\d{1,2}[/\.月]\d{1,2}日? → 日付

{min,} 直前のパターンのmin回以上繰り返し(最長一致)

例1)ABC{3,} → ABCCC、ABCCCC、ABCCCCC など
例2)\d{4,} → 4桁以上の数字

{num} 直前のパターンのnum回繰り返し

例1)ABC{3} → ABCCC
例2)\d{4} → 4桁の数字

{min,max}? 直前のパターンのmin回からmax回繰り返し(最短一致)

例1)ABC{3,5}? → ABCCC
例2)\d{4,10}? → 4~10桁の数字(最短一致)

{min,}? 直前のパターンのmin回以上繰り返し(最短一致)

例)ABC{3,}? → ABCCC

{num}? 直前のパターンのnum回繰り返し(最短一致)

例1)ABC{3}? → ABCCC

・・・(?=~) 先読み肯定グループ
後方の文字列が~だった場合の・・・にだけ一致する

例1)MIFES(?=9|10) → MIFES9、MIFES10 のMIFES部分
例2)ab(?=cd) → abcd の中の ab
例3)ab(?=cd|ef) → abcd か abef の中の ab

・・・(?!~) 先読み否定グループ
後方の文字列が~ではない場合の・・・にだけ一致する

例1)MIFES(?!9|10) → MIFES9、MIFES10 以外のMIFES部分
例2)ab(?!cd) → 後ろが「cd」ではない「ab」

(?<=~)・・・ 後読み肯定グループ
前方の文字列が~だった場合の・・・にだけ一致する

例1)(?<=9|10)MIFES → 9MIFES、10MIFES のMIFES部分
例2)(?<=ab)cd → abcd の中の cd
例3)(?<=ab|cd)ef → abef か cdef の中の ef

(?<!~)・・・ 後読み否定グループ
前方の文字列が~ではない場合の・・・にだけ一致する

例1)(?<!9|10)MIFES → 9MIFES、10MIFES 以外のMIFES部分
例2)(?<!ab|cd)ef → 前が「ab」か「cd」以外の 「ef」

▲目次へ戻る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です