質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

4回答

4246閲覧

正規表現で日本語を取得したい

Matt

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

1グッド

1クリップ

投稿2017/09/13 13:38

###教えてもらいたいこと
任意の文字列から,日本語の部分を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() + ""); } }

###今分かっていること
・日本語(ひらがな,カタカナ,漢字)を表す正規表現:亜-熙ぁ-んァ-ヶ
・最小マッチ,最大マッチの方法

よろしくお願いします.

A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Unicodeの文字のブロックに触れてみる

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
SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matt

2017/09/13 14:14

Unicode試してみました.正規表現は[亜-熙ぁ-んァ-ヶ]より,上記の方がよいのでしょうか?
SVC34

2017/09/13 14:27 編集

[亜-熙]はShift-JISでのコードポイントが前提なのでダメなようです。 Unicodeの場合に日本の常用漢字を範囲で表すと[一-龠]になるようです。 JavaScriptで漢字を表す正規表現 http://stabucky.com/wp/archives/7594
SVC34

2017/09/13 14:44

どれが適切か、というのは結局どこまでマッチさせたいか、もしくはマッチしてしまっても許容するかという要件次第です Unicodeで「漢字」の正規表現 http://tama-san.com/kanji-regex/
Matt

2017/09/13 15:22

[一-龠]を使うことにします
guest

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

yamashita_yuich

総合スコア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

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matt

2017/09/18 04:55

正規表現は戻ることができないのですね.べんきょうになりました.
guest

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

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matt

2017/09/13 14:01

\p{Katakana}などの正規表現は使えないようです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問