JavaScript: 文字列の処理: 正規表現 (1)
正規表現の初歩
文字列の分割や抽出や置換などの処理では 正規表現 を多用します。 正規表現は難しい話もたくさん出てきますが、 初歩的な使い方は簡単なのではじめの一歩で慣れてください。
正規表現の書き方
正規表現は /正規表現/ のように / で囲んだ書き方をします。
例: /正規表現/ 例: /あいう/ /正規表現/オプション 例: /あいう/g
下はコードはどれも同じ意味です。 正規表現 (RegExp) のオブジェクトを作ります。
let re = /ABC/g; // 通常はこちらで書きます。 let re = new RegExp(/ABC/g); // 書くのが面倒なので使わない。 let re = new RegExp("ABC", "g"); // 書くのが面倒なので使わない。
上で作った RegExp のオブジェクトを String.split() や String.replace() などの関数の引数に渡します。
◎ 文字列 s の一部を置換する例 //文字列 s の中にある文字列 "ABC" をすべて "123" に置き換える。 let re = /ABC/g; let result = s.replace(re, "123"); //上の処理は 1行にまとめると下のようになります。 let result = s.replace(/ABC/g, "123");
正規表現の簡単な使用例
テキストを行に分割する例
- テキストを行に分割する
- TestJS_parse_line01.html
textarea のテキストを読んで行の配列に分割する。
//テキストを行の配列に分割する const array = text.split(/\r\n|\n|\r/);
String.split() 関数で文字列を改行コードで分割して 行単位のテキストの配列にする処理です。 split() 関数の引数で正規表現 /\r\n|\n|\r/ が出てきます。
\r (キャリッジリターン) や \n (ラインフィード)
は改行を表します。
HTML: 改行を表す文字コード
| は OR (または) を表す演算子です。 /\r\n|\n|\r/ は 「\r\n または \n または \r」 を表す正規表現になります。 String.split() 関数に引数に渡すと、 テキストの中で上の文字列が出現するとそこでテキストを分割します。
1) \r\n と 2) \r, \n を並べるときに順序依存がある点に注意してください。 先に \r を書くと \r\n を含む文字列でも \r だけで分割してしまい、分割後の文字列に \n が混ざります。 先に \n を書いた場合でも分割後の文字列に \r が混ざります。
文字列を置換する例
- TestJS_RegExp_replace01.html
String.replace() 関数で文字列を置換するサンプル。
文字列を置換する (1)
/g、/i などのオプション
例: /word/ 文字列 "word" を最初の 1個だけ探す。置換の場合は最初の 1個だけ置換する。 /word/g 文字列 "word" を繰り返し探す。置換の場合はすべて置換する。 /word/i 文字列 "word" の大文字・小文字を区別しない。 /word/gi g と i の組み合わせ。置換の場合は大文字・小文字を区別せず、すべて置換する。
オプションは他にもいくつかあります。
一部の文字では \ エスケープが必要です
正規表現を書くときに一部の文字は特別な意味を持つので注意が必要です。
通常の文字として認識させたい場合は \ でエスケープします。
◎エスケープの必要な文字 ^ $ \ . * + ? ( ) [ ] { } | / ◎エスケープの記述例 (通常の文字として認識させたい場合) \ → \\ . → \. [ → \[ ( → \( など
\ エスケープを忘れると別の意味に解釈されて誤動作するので注意が必要です。
- TestJS_RegExp_replace_escape01.html
replace() で \ エスケープを忘れるとどうなるか?のサンプル。
◎ 特別な文字の意味 \ エスケープを意味する . 改行コード以外の任意の一文字 * 0回以上の繰り返し + 1回以上の繰り返し () キャプチャー [] 文字の種類や範囲の指定 {} 回数の範囲指定 など
\ も通常の文字として認識させたい場合は必ず \\ と書いてください。 \文字 が特別な意味を持つ場合もあるので注意が必要です。
◎ \文字 が特別な意味を持つ場合 1) MDN: 文字エスケープ \n (改行), \t(タブ) \uHHHH (ユニコード, H は hex値) など 2) MDN: 文字クラスエスケープ \d \D \s \S \w \W
正規表現にエスケープや特別の意味を持つ記号文字がまざると、 だんだん意味不明な記号まみれの文字列になります。 正規表現が難解であまり眺めたくないと思われる理由・・・。
いろいろ
JavaScript: 文字列の処理: 正規表現 (2) に続く