- ベストアンサー
正規表現を使用しない置換方法で giオプション
正規表現を使用せず文字列を置換したいと思っています。 (文字列.replaceはOKだが引数で正規表現は使用せず、単純置換のみ) その際、以下を満たす置換方法はありますか? 1.大文字小文字区別せず 2.検出した箇所すべて 例えば 文字列.split("検出文字列").join("置換文字列") のような方法であれば、2は満たせますが、1が満たせません。 ご回答お待ちしております。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#1,2,4 です。 #4 の補足を読みました。 > 実現したいことは、ユーザーに正規表現か単純置換かを選択させ実行させるというものなのですが、正規表現を使ってエスケープシーケンスなどと認識させずに置換することができればそれでもOkです。 正規表現を使って良いなら、検索文字列のメタキャラクタをエスケープすれば new RegExp, String#replace で実現できます。 https://gist.github.com/think49/7691225 正規表現を全く使わないなら、#4の方法ですね。 # Re: nshoesさん
その他の回答 (4)
- think49
- ベストアンサー率59% (285/482)
#1,2 です。 > 1.大文字小文字区別せず 残りは自分で考えてもらおうと思ってあえて書いてませんでしたが、任意の文字で大文字/小文字を区別しない方法はあります。 String#charCodeAt で該当文字の Unicode 値を取得した場合、a と A の差分は 32 になります。 始めに Unicode 値を範囲指定して各々で加算/減算をすれば該当文字を検出することが出来るでしょう。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt # Re: nshoesさん
補足
ありがとうございます。 実現したいことは、ユーザーに正規表現か単純置換かを選択させ実行させるというものなのですが、正規表現を使ってエスケープシーケンスなどと認識させずに置換することができればそれでもOkです。Perlでいう\Q\Eでサンドイッチするみたいな機能です。 上記機能は他の言語では普通にあると思うのですが、javascriptではないものでしょうか。。
- notnot
- ベストアンサー率47% (4900/10359)
1を満たす方法はないでしょう。 大文字小文字のあらゆる組み合わせを作り出して並べるしか無い。 1文字だけならNo1の方の書いているとおり2回ですが、複数文字だとどんどんパターン数が増える。 正規表現を使わないというのは現実的で無いですね。
- think49
- ベストアンサー率59% (285/482)
#1 です。 gオプションも踏まえると、仰るとおり split, join の組み合わせになりますね。 'aaAAbbBBccCC'.split('a').join('Z').split('A').join('Z'); // a を Z に置換する String#indexOf を再帰して文字列を走査する方法もありますが…。 # Re: nshoesさん
- think49
- ベストアンサー率59% (285/482)
どういう意図があるのかわかりませんが、String#replace を2回実行すればいいのではないでしょうか。 'aaAAbbBBccCC'.replace('a', 'Z'),replace('A', 'Z'); // a を Z に置換する
お礼
ご回答ありがとうございます。 メタキャラクタをエスケープし、パターン指定することで目的の動作を得ることができました。 pattern = "検索文字列".replace(/([\$\(\)\*\+\-\.\?\[\]\^\{\|\}\\])/g, '\\$1')