- ベストアンサー
正規表現にマッチする部分文字列を大文字に置換する方法
表題の通りです。 replaceAllやtoUpperCaseを組み合わせて試行錯誤したのですが、どうにもうまく行きません。よい方法を御存知の方が居られましたら、どうか御教示ください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとしたサンプルを作ってみました ---------------------------------------------------------------- import java.util.regex.*; class MatchUpper { public static void main(String args[]) { StringBuffer a = new StringBuffer("<a href=\"http://www.yahoo.co.jp/\">Yahoo! JAPAN</a>"); Pattern pat = Pattern.compile(">.*?<",Pattern.CASE_INSENSITIVE); Matcher m = pat.matcher(a); if(m.find()){ String b = a.substring(m.start(),m.end()); System.out.println(b);//マッチした部分 a.replace(m.start(),m.end(),b.toUpperCase()); System.out.println(a);//マッチした部分を大文字にした } } }
その他の回答 (2)
- arakororin
- ベストアンサー率39% (80/205)
正規表現に関してはその機能が豊富なのでoroをよく使います。 Perl5Util (Jakarta-ORO 2.1-dev-1 API) http://jakarta.apache.org/oro/api/org/apache/oro/text/perl/Perl5Util.html 質問者さんの要望は、察するに以下のようなことをしたいのではないかと思います。どうでしょう? (変換結果1)qawsedrftgy HUJIKO lp; (変換結果2)qawsedrftgyhuji1kolp; package com.mady.test.RegTest; import org.apache.oro.text.perl.Perl5Util; /** * 前方参照の記号が SUNのJavadocでは * * @author miura */ public class 大文字置換 { /** * メインメソッド * * @param args * 外部入力引数 */ public static void main(String[] args) { // hujiの4文字で始まって2文字のアルファベットが続く文字列を // 大文字に置換する。 // ついでに分かりやすくするためにその前後に空白を入れる String pattarn = "s/(huji[a-zA-Z]{2})/ \\U$1 /g"; String input = "qawsedrftgyhujikolp;"; Perl5Util perl5Util = new Perl5Util(); String result = perl5Util.substitute(pattarn, input); System.out.println(result); // hujiの後に数字が入っているので対象にはならない input = "qawsedrftgyhuji1kolp;"; result = perl5Util.substitute(pattarn, input); System.out.println(result); } }
お礼
御回答ありがとうございます。 このパッケージの存在は知りませんでした。かなり使いでがありそうですね。さっそくドキュメントを読んでみます。 どうもありがとうございました。
- freedom560
- ベストアンサー率46% (80/173)
単純に考えるとtoUpperCaseを使おうと思う気がします。 まずはあなたがどのように「replaceAllやtoUpperCaseを組み合わせて試行錯誤した」のかを示し、どのようにうまくいかなかったのかを明確にした方がよいのではないでしょうか。
お礼
確かに、御回答のように真っ先に考えたのはtoUpperCaseなのですが、単純に使ったのでは全文が大文字になってしまいます。 そこで、replaceAllで何とかならないかと考えたのですが、この場合は変換後の文字列を一意に指定しなければなりません。 ならばと、substringで条件に合致する部分を抜き出し、手作業でロジックを組んで置換する方法を考えましたが、該当する部分文字列が不定長であるために、正規表現にマッチしたとして何文字切り出せばいいかわからないという問題に突き当たってしまいました。 最終手段としては文字列全てを一文字ずつ条件判定しながら解析する方法も考えたのですが、対象として想定しているのが数百kB以上のファイル丸ごと一つなどですので、あまりうまくないような気がします。 何とか、標準関数の組み合わせでうまい方法はないかと考え、相談させて頂きました。
お礼
御回答ありがとうございます。 その手があることをすっかり失念していました。substringで取り出してtoUpperで変換したものをreplaceしてやればいいんですよね。 何やら随分と簡単なことで悩んでいたような気がします。どうもありがとうございました。