###教えてもらいたいこと
任意の文字列から,日本語の部分をString配列orListで取得する方法が知りたいです.
###日本語取得の例
下のコードであれば,出力結果は「亜 え ふ ぃ えふ ふぃ えふぃ」(順不同)となってほしいです.
public static void main(String[] args) { String str = "g亜nergえふぃwjtoo"; String regex = "「日本語を取得する正規表現」"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher("aaaaa"); while(m.find()) { System.out.print(m.group() + ""); } }
###今分かっていること
・日本語(ひらがな,カタカナ,漢字)を表す正規表現:亜-熙ぁ-んァ-ヶ
・最小マッチ,最大マッチの方法
よろしくお願いします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
java
1// 平仮名4つ 2System.out.println( "ひらがな".matches( "\\p{InHiragana}{4}" ) ); 3 // => true 4 5// カタカナ4つ 6System.out.println( "カタカナ".matches( "\\p{InKatakana}{4}" ) ); 7 // => true 8 9// 漢字2つ 10System.out.println( "漢字".matches( "\\p{InCjkUnifiedIdeographs}{2}" ) ); 11 // => true
漢字は日本のものに限定できないようですが
必要に応じて以下等も追加してください
- CJK_SYMBOLS_AND_PUNCTUATION
- CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
投稿2017/09/13 14:03
編集2017/09/13 14:30総合スコア1149
0
まずはご質問事項に回答致します。
日本語(ひらがな,カタカナ,漢字)を表す正規表現:亜-熙ぁ-んァ-ヶ
私は2バイト文字を探す、という意味で "[^\x01-\x7E]" をよく使用しています。個人的にはこれがおすすめですが色んな方法があると思いますので色々調べてみると面白いと思います。
最小マッチ,最大マッチの方法
上記正規表現にて最小マッチと最大マッチを実行する場合、
最大マッチは
[^\x01-\x7E]+
最小マッチは
[^\x01-\x7E]+?
となります。
+はその前のセンテンス(今回の場合は「[^\x01-\x7E]+」)が1文字以上であること、という意味です。
また、?を付与することで最小マッチという意味になります。
さて、コードについてですが、最小マッチと最大マッチを同時に取得する正規表現は簡単には実施できませんし、そのような正規表現が書けたとしても一般的な理解しやすい正規表現ではなくなると予想できますので、おすすめできません。自分以外のコーダーがそのソースを見てもすぐに理解できないからです。
そこで、以下のように一度最大マッチで文字列を取得した後、Javaプログラムにてマッチした文字列の成形を実施するパターンはいかがでしょうか。
Java
1 public static void main(String[] args) { 2 3 // 検索対象文字列 4 String str = "g亜nergえふぃwjtoo"; 5 6 // 正規表現パターン(最長マッチ) 7 String regex = "[^\\x01-\\x7E]+"; 8 9 // 正規表現オブジェクト取得 10 Pattern p = Pattern.compile(regex); 11 12 // パターンマッチ実施 13 Matcher m = p.matcher(str); 14 15 // 全マッチを走査 16 while (m.find()) { 17 18 // マッチ結果をバッファ取得 19 String buf = m.group(); 20 21 // マッチした文字列を文字数ごとに分割して出力 22 for (int i = 1; i <= buf.length(); i++) { 23 for (int j = 0; j <= buf.length() - i; j++) { 24 System.out.print(buf.substring(j, j + i) + " "); 25 } 26 } 27 28 } 29 }
投稿2017/09/16 16:07
総合スコア316
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
Javaの正規表現マッチングでは、一度読み込んだ文字を巻き戻してもう一度読み込むということはできない(後読みというのはあるが、位置に関するマッチングを行うだけで巻き戻してマッチさせるということができない)ので、マッチングのみでご質問の結果を得ることはできません。
いったん日本語部分の文字列をすべて取り出した後、各文字列から部分文字列をすべて取り出すという作業を別途行う必要があります。
java
1import java.util.regex.Matcher; 2import java.util.regex.Pattern; 3import java.util.stream.Stream; 4import java.util.stream.Stream.Builder; 5 6public class Q92346 { 7 8 public static void main(String[] args) { 9 String str = "g亜nergえふぃwjtoo"; 10 11 String regex = "[一-龠ぁ-ゞァ-ヶ]+"; 12 Pattern p = Pattern.compile(regex); 13 Matcher m = p.matcher(str); 14 Builder<String> builder = Stream.builder(); 15 16 while(m.find()) { 17 builder.accept(m.group()); 18 } 19 20 builder.build() 21 .flatMap(Q92346::partials) 22 .forEachOrdered(System.out::println); 23 24 } 25 26 public static Stream<String> partials(String target) { 27 Builder<String> builder = Stream.builder(); 28 for (int i = 0; i < target.length(); i++) { 29 for (int j = i + 1; j <= target.length(); j++) { 30 builder.accept(target.substring(i, j)); 31 } 32 } 33 return builder.build(); 34 } 35 36} 37
投稿2017/09/13 16:51
総合スコア20675
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
javaは知らないので、正規表現のみ示します。
/\p{Katakana}+/ /\p{Hiragana}+/ /\p{Han}+/ /\p{Katakana}+?/ /\p{Hiragana}+?/ /\p{Han}+?/
上から、
1文字以上のカタカナ(最大マッチ)
1文字以上のひらがな(最大マッチ)
1文字以上の漢字(最大マッチ)
1文字以上のカタカナ(最小マッチ)
1文字以上のひらがな(最小マッチ)
1文字以上の漢字(最小マッチ)
投稿2017/09/13 13:49
総合スコア13727
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/13 14:14
2017/09/13 14:27 編集
2017/09/13 14:44
2017/09/13 15:22