Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

記号と文字の判別について

テキストファイルから読み込んだ英文の文章の文字列を英文字と数字だけ抜き取って使用したいんですが、「.,:-」などの記号と文字を区別させる方法がわかりません。誰か教えていただけないでしょうか。

4

回答

5523

閲覧

4件の回答

評価

0

今はどうやって区別しているのですか?

評価

0

普通に文字列か記号の判定をすればいい気がしますが…
または、正規表現を使うかですかね。

評価

0

要件が今一よくわからないのですが
>英文字と数字だけ抜き取って使用したいんですが
ということは次のような文章があった場合。
「123&XYZ Weather_elements (e.g., cloud cover, maximum temperature) on a seamless grid.」

「123XYZ Weather_elements eg cloud cover maximum temperature on a seamless grid」
こんな感じにしたいのでしょうか?

例えば上記の場合だとやはり正規表現を使うのが楽です。
上の例のようにするには以下のようにします。

// 元の文字列
String str = "123&XYZ Weather_elements (e.g., cloud cover, maximum temperature) on a seamless grid.";
// 正規表現を指定します
Pattern pattern = Pattern.compile("[^ \\w]");
// 上の正規表現にマッチさせます
Matcher matcher = pattern.matcher(str);
// マッチした文字を消します
String dest = matcher.replaceAll("");
System.out.println(dest);

compile("[^ \\w]")に出てくる[^ \\w]は全てに意味があります。
ややこしいですが、慣れると便利です。
何をしてるかというと、半角空白と\w以外にマッチしなさいと言う指定をしています。
\wは「文字・数字・アンダースコア」を意味しているので
>「.,:-」
などがマッチします、その後replaceAll("");でマッチした文字を消しているので要らないものが
消えた文章になります。

例えば&や()も必要な場合はcompile("[^&() \\w]");
のように[]の中に追加してやります、すると以下のような結果になります。
「123&XYZ Weather_elements (eg cloud cover maximum temperature) on a seamless grid」

このように取り出した文字列を空白で分解したい場合は以下のようにsplitすると、配列に分解した文字列が入ります。
String[] splitStr = dest.split(" ");

もしかして、はずしているかもしれません・・

正規表現自体は以下を読んで見てください。
http://www.javaroad.jp/java_character7.htm

評価

0

toCharArray()でchar配列にしてループでチェック、英数字であれば新しいStringBuilderへappend()するというのが、一番ベーシックですね。

…で、質問からするとその際のif文をどう作ったらいいのか分からないというように見えました。
・'0'以上'9'以下、'a'以上'z'以下、'A'以上'Z'以下の3つをチェックする
・boolean check[256]に対してcheck['0']=true;check['1']=true;…check['Z']=true;でマッチする
・"0123456789abcde…XYZ"のindexOf()を取る
などの方法があります。

ひとつで満足せずにいろいろな方法で動くものを作ると、力になりますよ。
正規表現はすっきり書ける反面、速度的には不利になります。どういうものを作りたいのか、よく考えましょう。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。