モーリーのメモスマートフォン用の表示で見るモーリーのメモアプリ開発等(プログラミング、CG作成)、興味を持ったことを実践してまとめるブログです。JavaScript『replace()』は、文字列の置換を行う関数です。基本的な使い方は、下記の通りです。結果:resultは"1bc1bc"になる『replace()』の第1引数の『/a/g』は、検索する文字列を正規表現で表したものです。正規表現では、検索する文字列を『/(スラッシュ)』で囲みます。末尾の『g』は、最後まで探すというフラグです。フラグは、下表のようなものがあります。1個目だけでなく最後まで検索します。検索の際に大文字と小文字を区別しません。複数行に渡って検索します。*『g』フラグを付けないと1個目しか置換しません。"1");』のように通常の文字列で検索すると1個目しか置換されません。resultは"1bcabc"になる(1個目だけ置換)正規表現を使う利点は、文字のパターンで検索出来ることです。文字のパターンで検索することで、『"'abc','de',f"』→『"1,1,f"』のように文字の種類、長さの異なる'abc'と'de'を一度に置換することが出来ます。『replace()』の第2引数にコールバック関数を指定すると、見つかった文字ごとに違う処理を行うことが出来ます。私が使用している環境です。ドキュメントのスクリプトエディタで動作確認しました。正規表現では、メタ文字を使って文字のパターンを表現します。文字の種類や長さが異なる'abc'と'de'を一度に置換出来ている2行目の『'.*?'』は『'(シングルコーテーション)で囲まれている文字列』という文字のパターンを表した正規表現です。パターンで検索するので、文字の種類や長さが異なっても一度に置換出来ます。下表は、使用したメタ文字とその意味です。直訳すると『'.*?'』は『'(シングルコーテーション)の後に、任意の文字が0文字以上続き、再び'(シングルコーテーション)が来る文字列の中で最短のもの』という意味になります。上記以外にも様々なメタ文字があります。下記のサイトで一覧を見ることが出来ます。『*?』:最短一致(当てはまる中で最短のもの)を検索します。『*』:最長一致(当てはまる中で最長のもの)を検索します。最長一致、結果:resultは"1,f"になる『'a』から『'(シングルコーテーション)で囲まれている文字列』を探すと、『'abc'』、『'abc','』、『'abc','de'』の3パターン見つかります。この中で『'abc'』が最短一致、『'abc','de'』が最長一致となります。メタ文字自身を検索するには『\(バックスラッシュ)』を付けるメタ文字を文字として検索したい場合は、その文字の前に『\(バックスラッシュ)』を付けます。『(』と『)』はそのままだとメタ文字として処理されます。それぞれ『\(バックスラッシュ)』を付けて『\(』と『\)』とすることで通常の文字として検索されます。『\』は、次の1文字はメタ文字じゃないよ、という意味です。狙い通りに正規表現を作成するのは、なかなか難しいです下記のサイトでは、リアルタイムで結果を確認しながら、正規表現を作成出来ます。"&ltb>abc</b>,&ltb>de</b>,f"上記の置換は、"abc"→"&ltb>abc</b>"、"de"→"&ltb>de</b>"のように見つかった文字列を置換後に使用しています。この置換を行うには下記の方法を用います。結果:resultは<b>abc</b>,<b>de</b>,f『/abc|de/g』により、"abc"または"de"を検索しています。『$&』は、"abc"が見つかった時は"abc"に置換され、"de"が見つかった時は"de"に置換されます。結果:resultは"<b>abc</b>,<i>de</i>,f"になる『/(abc),(de)/g』により『"abc,de"』を検索しています。『(』と『)』はメタ文字です。置換後に使いたい部分を『()』で囲みます。『$1』は、1個目のカッコ内の『"abc"』を呼び出します。『$2』は、2個目のカッコ内の『"de"』を呼び出します。コールバック関数『function()とarguments』を使用するコールバック関数を使うとさらに複雑な置換が可能です。『replace()』の第2引数に『置換後の文字列』の替わりに、コールバック関数の『function(){}』を渡します。結果:resultは"'ABC','DE',f"になる『arguments[0]』がいきなり出てきますが、決まりごとです。検索条件に合った文字列が見つかるたびにコールバック関数が実行され、『arguments[0]』に見つかった文字列が代入されます。コールバック関数内で文字列を大文字に加工して『return』で返すと、それが置換後の文字列となります。『arguments[0]』だけでなく『arguments』配列には検索条件に応じて検索結果が代入されます。『arguments』配列のサイズは、下表のように正規表現に含まれる『()』の数で変わります。結果:resultは"'<abc>',[de],f"になる『/'(.*?)'|<(.*?)>/g』により『''で囲まれた文字列』または『<>で囲まれた文字列』を検索します。『arguments[0]』には『検索条件で見つかった文字列』が代入されます。『arguments[1]』には『検索条件内の1番目の()に該当する文字列』=『''で囲まれた文字列』が代入されます。『arguments[2]』には『検索条件内の2番目の()に該当する文字列』=『<>で囲まれた文字列』が代入されます。arguments[2])』によって『''に囲まれず、<>に囲まれた文字列』の場合だけ、『[]』で文字列を囲む置換を行っています。正規表現の『()』の囲み方の違いについて上記の例で、カッコの位置が『(<.*?>)』の場合は『arguments[2]』は『』となります。カッコの位置が『<(.*?)>』の場合は『arguments[2]』は『de』となり、『<>』の中身を取得できます。RegExp()』を使うと通常の文字列から正規表現を動的に作成できます。'g')』は『//g』と同じ意味です。結果:resultは"りんご,ぶどう,もも"になる『検索の文字列』と『置換後の文字列』のペアの配列を作成し、forループ内で動的に正規表現を作成して各ペアの置換を実行しています。RegExp()』に渡す文字列の『\』を2重にする必要があります。例:『\』を含む文字列から正規表現を動的に作成する『\b』は単語の区切りを意味するメタ文字です。『grape』を検索する際に『grapefruit』が検索されないようにするには『/grape\b/g』と書きます。RegExp()』に渡す文字列に『\』が含まれるので『\』を下記のように2重にして渡します。結果:resultは"abcタブde"になるバックスラッシュだらけです。あとがき複雑な正規表現は、ぱっと見では意味がわかりにくいです。思い通りに検索できる正規表現を作るのには慣れが必要です。いろいろな文字列を探すための正規表現の例をネットで見つけることも出来ますが、その複雑さに嫌になることも多々あります。個人的には、複雑な正規表現を組むより、argumentsを利用してプログラム的に処理したほうがわかりやすい場合もあります。処理速度には、全て正規表現で処理するより遅くなるのかもしれませんが。Creatorでも正規表現が使えました。(確認はブラウザ実行だけです。Excelのデータを音声で読み上げさせます。↑の記事のプログラムの派生版です。文...2016-05-14googleドキュメントで、ソースコードのインデント設定とHTMLタグの作成!記事を修正しました。(8)参加グループプログラミングリンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!mmorleyさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。