超便利!replaceを使った文字列置換・正規表現の使い方!
18/11/18 14:03:16 19/05/05 15:04:21
replaceメソッドによって文字列置換、正規表現への置換が使える言語はいくつかありますが、今回はJavaScriptをベースに解説していきます。replaceメソッドは対象を完全に別の文字列に置き換えることも可能なのですが、どちらかというとちょっとした形式の変更などに使用されることが多いです。
具体的には、システムの日付表示の方法が変わったから正規表現を指定して表示形式を変えておく、などの使い方になります。文字列置換は直接置き換える文字列を指定する方法と正規表現を指定して置き換える方法があるので、それぞれ解説していきます。
目次
基本的な置換処理
まずはもっとも簡単な置換処理を紹介します。サンプルコードは以下です。
var class= '1_1';
var result = class.replace( '_', '-' );
console.log( result );
宣言部分は割愛していますが、上記のソースコードを実行すると以下のようにコンソール出力されます。
1-1
アンダーバーがハイフンに置き換えられました。上記のコードでは一つだけを置き換えていますが、一つだけなら普通に書き換えた方が早いです。もちろんreplaceメソッドは一つの要素だけを書き換えるためのメソッドではないため、複数の要素を書き換えることができます。
複数の要素の書き換えの前に、複数の要素に対して普通に処理を記述した場合どうなるか確認します。
var class = '1_1, 1_2, 1_3';
var result = class.replace('_', '-');
console.log( result );
上記のコードを実行すると、以下のようにコンソール出力されます。
1-1, 1_2, 1_3
最初に一致した1_1だけが1-1に置き換えられました。replaceの仕様上一致した瞬間置き換えて処理終了するようになっているため、最後まで検索してくれる機能がないのです。おそらく、最後まで検索して置き換える場合と分けるためにあえてこのような仕様になっているのだと思います。
上記の例だと最初の1組だけ置き換わっていて違和感があるのですが、最初だけを書き換えたい場合もあります。そこで最後まで検索して置き換える場合以下のように記述します。
var class = '1_1, 2_2, 3_3';
var result = class.replace('_', '-');
//「class」と「result」が同じ文字列になるまで繰り返す
while(result !== class) {
class = class.replace('_', '-');
result = result.replace('_', '-');
}
console.log( result );
上記のコードを実行すると、以下のようにコンソール出力されます。
1-1, 1-2, 1-3
すべてのクラスがハイフンに置き換えられました。これで一応はすべて置き換えられたのですが、実際のシステムだと関係ないアンダーバーまでハイフンに置き換えてしまうかもしれません。
たとえば変数のなかに上記のクラスだけでなく、名前、メールアドレスなども入っていたとします。そうすると、メールアドレスのアンダーバーまでハイフンに書き換えてしまうかもしれません。
そこで、正規表現を使用します。
正規表現を用いた置換方法
正規表現を用いて置換処理を実装すると以下のようになります。
var class= 'c-101, c-12, c-103';
// 正規表現による指定
var result = class.replace(/c-\d\d,/, 'c-000,');
console.log( result );
上記のソースコードを実行すると、以下のようにコンソール出力されます。
c-101, c-000, c-103
なぜこのようになるかというと、「c-\d\d,」で「c-数値二桁,」という条件に合致する要素を検索しているからです。条件に合致するのは「c-12,」だけなので、c-12だけがc-000に置き換えられました。
また、正規表現で複数要素を置き換える際は、whileのような繰り返し処理を実装する必要がありません。具体的には以下のような記述で済みます。
var class = c_1, c_2, c_3';
// 正規表現に「g」フラグを追加
var result = class.replace(/_/g, '-');
console.log( result );
上記のコードを実行すると、以下のようにコンソール出力されます。
c-1, c-2, c-3
gフラグとは、正規表現と一致する限り検索、置換を続けるためのフラグです。これを使用することで、while文を書かなくても自動的にすべての検索、置換を行います。gが何の略化はわかりませんが、going concernと覚えると良いかもしれません。
going concernは企業が将来に渡って継続的に事業を続けるようなことですが、邪魔ならconcernはなしでも良いかもしれません。goingだけだと行っている、と言う意味かもしれませんが、going concernのconcernを外したgoingです。
特殊文字を使った置換
正規表現にはグループ化の概念も存在し、対象を$1、$2と文字列に置き換えることが可能です。サンプルコードは以下です。
var name= 'Nobi Nobita';
var result = name.replace( /(\w+)\s(\w+)/, '$2 $1' );
console.log( result );
上記のソースコードを実行してコンソール出力すると、以下のようになります。
Nobita Nobi
Nobiが$1、Nobitaが$2に代入されたのですが、変数に入れる段階では番号順になります。つまり、$2 $1と逆に記述すれば苗字と名前がひっくり返ります。また、特殊文字を使用して特定の文字列を抽出したり置き換えることも可能です。
var text = 'a, div, p';
var result = text.replace( /(a|p|div)/g, '<$&>' );
console.log( result );
上記のソースコードを実行すると以下のように出力されます。
<a>, <div>, <p>
まず「$&」は一致する文字列を抽出するためのコードです。そして「<>」で囲っているため、<>に囲った状態で出力されました。
第二引数に関数を指定する
最後に応用的な用法になりますが、replaceの第二引数に関数を指定したロジックを紹介します。サンプルコードは以下です。
var name= 'NOBI, NobiTA';
// 大文字の英語すべてに関数「toLower」を実行する
var result = name.replace( /[A-Z]/g, toLower );
// 関数の作成
function toLower( s ) {
// 取得した対象文字「s」を小文字にする
return s.toLowerCase();
}
console.log( result );
上記のソースコードを実行すると、以下のようにコンソール出力されます。
nobi, nobita
正規表現[A-Z]で大文字検索を行いますが、gが入っているのですべて抽出します。そして下で定義している関数toLowerが第二引数になっているので、抽出した大文字をすべて小文字に変換します。
以上、replaceを使った文字列置換、正規表現について解説してきました。正規表現の書き方に慣れるまで多少時間が掛かるかもしれませんが、replace以外のメソッドでも正規表現は頻繁に使用することになるかと思うので、そのうち慣れていきます。
案件量が豊富なアルマサーチ
最後に、アルマサーチのご紹介!
アルマサーチはフリーランス向けに案件をご紹介することに特化したエージェントサービスです。豊富な案件量から、安定して継続的な案件のご紹介を実現しており、口コミから登録エンジニアが急増中です。
アルマサーチが選ばれる理由
- 豊富な案件量。週3?4日の案件や在宅リモート案件も。
- 優秀なコンサルタント陣。
- 案件に参画後もしっかりサポート。
豊富な案件量
フリーランス向けに特化し、業界屈指の案件量を誇ります!週3?4日の案件や、在宅リモート案件もありますし、その他あらゆる希望をしっかりお伝えください。最適な案件のご紹介をさせていただきます。
優秀なコンサルタント陣
技術に疎く、開発の希望を伝えても響かないエージェント・・・嫌ですよね。アルマサーチにはそのような者は一切おりません!さらに独立にまつわる税金や保険関係に詳しいスタッフが徹底的にサポートさせていただきます。
案件に参画後もしっかりサポート
常駐先が決まった瞬間に、一度も連絡が取れなくなるエージェント・・・いますよね?アルマサーチでは、そのようなことは一切ありません!常に電話やメールは即対応しますし、月に1度のランチミーティングなどから現場の状況を細かくヒアリングし、就業環境改善に尽力いたします。
人気記事