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

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

ただいまの
回答率

87.78%

スペース文字で区切られた文字列を正規表現で抽出したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 582

str = "a bc def g hi";
のようなString変数があったとして、半角スペースで区切られた文字列を"a"と"bc"と"def"と"g"と"hi"のように抽出したいです。

  String regex_a = "^((.+?)( $))";         // 後ろに半角スペースがある最初の文字列
  String regex_b = "((^ )(.+?))$";         // 頭に半角スペースがある最後の文字列
  Pattern p_a = Pattern.compile(regex_a);
  Pattern p_b = Pattern.compile(regex_b);
  Matcher m_a = p_a.matcher(str);
  Matcher m_b = p_a.matcher(str);

  while(m_a.find()){
    System.out.println("a : " + m_a.group(1));
  }
  // 文字列の最後には半角スペースがないので頭が半角スペースの最後の文字列を探す
  if(m_b.find()){
    System.out.println("b : " + m_b.group(1));
  }else{
    System.out.println("strに半角スペースが一つもない");
  }


プログラムは一応雰囲気こんな感じにしてますが、else文にしか行きつきません。
半角スペースはそのまま文字として使えるらしいですが、ファイルから取り込んだ文字列の半角スペースとプラグラムに直接打ち込んだ半角スペースとでは実際違ったりするのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

正規表現でしか駄目なんですか?
String[] hoge = str.split(" ");
なら簡単に出来ますけど…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/23 18:53

    String#splitの引数は正規表現文字列です。
    ただ java.util.regex パッケージの諸クラスに頼る必要が無いという主旨はおっしゃるとおりだと思います。

    キャンセル

  • 2020/01/23 19:38

    @NEO_PLANETT-777さんの回答が一番シンプルだと思います。
    区切り文字が決まっているような場合はあえて、正規表現で頑張ってゴリゴリ実装することはしません。

    なぜ取れないのかだけ回答すると先頭 ^ と末尾 $ に関する認識が違います。
    あくまでも先頭はチェック対象の文字列の先頭だけであって、チェック対象の途中には使えません。
    末尾も同様にチェック対象の文字列の末尾だけです。
    String str = "a bc def g hi" の場合
    先頭はaであり、半角スペースが一致することがないのでregex_bは一致なしになります。
    末尾はiであり、半角スペースが一致することがないのでregex_aは一致なしになります。

    キャンセル

  • 2020/01/23 20:05 編集

    正規表現だけで抽出することだけ考えててsplit()メソッドが使えることを忘れてました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る