- ベストアンサー
正規表現メタ文字-のエスケープ方法とは?
- 正規表現のメタ文字である「-」のエスケープ処理について質問です。特に「[」「]」の中で使用された場合に一括でエスケープする方法を教えてください。
- 具体的な例を挙げながら、「-」のエスケープ処理の結果を示しています。
- 一括エスケープ処理を行うための正規表現の指定方法を知りたいです。お手数ですが、教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
や, たぶん [a-z] を「a か z か - のいずれか」と解釈してほしいんじゃなかろうかと>#2. そうすると「[a-z] 全体」を「文字列」としてマッチさせちゃダメですからね. 一応指摘しておくと質問者も誤解しているところはあります. なので, 一定の条件を付ければ「正規表現で変換」できます. ただ, どこまで条件を緩めることができるかがちょっと見えません. 果てしなく読みにくい正規表現で完全に変換できるかもしれないんだけど, それよりは「1文字ずつちまちま」の方がよいかと.
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
あ本当だ, 「メタ文字全部エスケープ」なんだ... ごめんなさい>#2. それならそれで最初からそう書けばいいのに.... 「正規表現」といってもいろいろあるので, #2 が本線でしょうねぇ. それでダメなら相手次第.
- notnot
- ベストアンサー率47% (4900/10358)
No1です。 補足を見ましたが、「正規表現の特殊文字をすべてエスケープ」でいいんですよね。 Pattern.quote() でいいのでは?と思ったら、これって、\Q と \E で囲むだけなのか。。。使えないやつですね。渡し先のシステムがJavaならこれで良いのですが。 "もじれつ".replaceAll("(\\W)","\\\\$1") でどうですか。 普通の言語の正規表現だと、特殊文字以外の記号に¥をつけても別にかまわないので。英字や数字だと意味が変わるものがあるので、\W で英数字以外を全部エスケープ。 これでだめなら、そのシステムの正規表現の解釈と同じロジックを組み込んでエスケープするようにプログラムすることになります。
- Tacosan
- ベストアンサー率23% (3656/15482)
無理です. 1文字ずつ, ちまちま変換してください.
- kmee
- ベストアンサー率55% (1857/3366)
その渡す相手に「文字列として比較」するオプションとか、ないのでしょうか? 引数を追加する、とか、Perlの\Q \Eに相当する表記とか。
- notnot
- ベストアンサー率47% (4900/10358)
>上記の一括エスケープ処理を行ってくれる正規表現は、何を指定すればよいでしょうか。 正規表現はエスケープ処理(文字列の置換処理)などは行ってくれません。 そういうプログラムを書く必要があります。 正規表現の特殊文字全部をエスケープするならおそらくJavaにもそういうメソッドがあると思うのですが、 [ ] の中の - だけという特殊な要件(何故そんなことが必要なのか??)だとすると、 自分で正規表現文字列を解釈するようなプログラム(正規表現パーサー)を書く必要があります。 [ ] の中の - だけにマッチする正規表現というのはおそらく作れません。 非常に特殊な問題設定ですが、その問題自体が間違っているのではと言う気がしてなりません。 そもそも何がしたいのですか?
お礼
返答ありがとうございます。 確かに正規表現では一括置換をしてくれる、というものではないですね。 正確には、[]の中の-のみを指定することができる正規表現は何を指定すればよいか、ということになります。 その正規表現を使用すれば、例えば String#replaceAll([正規表現], "\\$1") のような書き方ができれば、 一括で置換が可能だ、という考えから、このような質問をしました。 やりたいことは、ある文字列の中にある正規表現のメタ文字を、一括でエスケープ処理してくれるような 処理が必要になり、その実現を正規表現とその一致した文字を置換する処理を行い、一括でできればいいな、思いました。 ある別システムにデータを渡すのですが、そのシステムではこちらから渡した情報そのままを検索条件として使用するため、 文字として指定したにも関わらず正規表現として機能してはまずいので、正規表現のメタ文字は事前にこちらでエスケープ しておく、ということになったからです。 なぜ、「[]の中の-」というのをピンポイントで質問しているかというと、他のメタ文字は、そのまま置換の指定 をすればいいのですが(例 String#replaceAll("+", "\\+"))、-という記号だけは、[]の中にある場合だけメタ文字 として機能する、ということからになります。 []の中に無ければ、通常の文字として指定されているので、エスケープ処理などは行ってはならず、[]の中にある場合のみ 置換を行いたいのです。