column

ITコラム

Idea

プログラミングノウハウ

2017.11.08

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

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

なお、未経験からITエンジニアへの就職に興味がある方や未経験からプログラミングを効率よく学びたいと考えている方は、就職率98.3%で受講料無料のプログラミングスクールプログラマカレッジもおすすめです。

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

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

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

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

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

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

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

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

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

 

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

「*?」で「 直前の文字が0文字以上続くもので、当てはまる中で最短のもの 」を表しますが、「*」のみの場合は、「 直前の文字が0文字以上続くもので、当てはまる中で最長のもの 」を表すので、「 let 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」

▲目次へ戻る

無料説明会

SHARE

最新記事

無料説明会に参加してみる

INTERNOUS,inc. All rights reserved.

無料オンライン説明会へ