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

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

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

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

正規表現

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

Q&A

解決済

1回答

1580閲覧

正規表現で"":で囲まれている文字列を抽出したい

mobage_sb69er

総合スコア7

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

正規表現

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

0グッド

0クリップ

投稿2020/01/22 09:44

Javaにて正規表現でString変数の中から"key":という規則でkeyの部分をすべて抜き出してString形式の変数に格納したいのですが、NullPointerExceptionが出てしまいます。うまく抜き出すにはどうしたらいいでしょう?

program

1 String regex_key = "\"(.+?)\":"; 2 Pattern p_key = Pattern.compile(regex_key); 3 Matcher m_key = p_key.matcher(str); 4 5 if(m_key.find()) { 6 //System.out.println("実行できてるか確認用"); 7 //System.out.println(m_key.group(1)); //確認用1 8 for(int i=0;i<=m_key.groupCount();i++) { 9 P_key[i] = m_key.group(i); 10 //System.out.println(P_key[i]); //確認用2 11 } 12 }

str

1"S":["a W^↓ S a","b W^↓ S b","ε"],"W^↓":["0 W_ 0_ ↓","1 W_ 1_ ↓","W_ ↓"],"W_":["0 W_ 0_","1 W_ 1_","↑"]

strのS,W^↓,W_を抜き出したいということです。

補足
この状態で実行するとNullPointerExceptionが出ますが確認用1でm_key.group()を出力するとm_key.group(0)は"S":を、m_key.group(1)ではSを出力して後はNullPointerExceptionが出ます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

groupCount()の用途が間違っています。
参考https://www.javadrive.jp/regex/ref/index2.html
パターンに含まれるグループの数=つまりパターン内のかっこの数を返します。
パターンのなかのかっこを増やして確認してみるとわかると思います。
""(.+?)":" の場合はgroupCount()は常に1
""(.+?)"(:)"の場合はgroupCount()は常に2

java

1 String str = "\"S\":[\"a W^↓ S a\",\"b W^↓ S b\",\"ε\"],\"W^↓\":[\"0 W_ 0_ ↓\",\"1 W_ 1_ ↓\",\"W_ ↓\"],\"W_\":[\"0 W_ 0_\",\"1 W_ 1_\",\"↑\"]"; 2 3 String regex_key = "\"(.+?)\"(:)"; 4 Pattern p_key = Pattern.compile(regex_key); 5 Matcher m_key = p_key.matcher(str); 6 7 while(m_key.find()) { 8 System.out.println(m_key.group(0));//=m_key.group()と同じ "\"(.+?)\"(:)"のパターンに一致した箇所 9 System.out.println(m_key.group(1));// パターンに一致した箇所のひとつ目の() (.+?) 10 System.out.println(m_key.group(2));// パターンに一致した箇所のふたつ目の() (:) 11 System.out.println(m_key.groupCount()); 12 }

上記のような感じで確認すればよいかと思います。
あと、パターンは ""([^"]+?)":" のほうが

投稿2020/01/22 11:00

storm3

総合スコア328

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問