ヘッダー画像

Javaの正規表現検索でハマったこと

投稿 2022年7月31日 最終更新 2022年7月31日 専門用語少なめ

ハマったこと

URLがhttpsかhttpかを判定したかった時に、
以下のような処理で判定しました。

public class RegularExpression {
  public static void main(String[] args) {
    String checkUrl = "https://inkblogdb.com";
    // SSL通信かを判定
    if (checkUrl.matches("https://")) {
      System.out.println("https");
    } else {
      System.out.println("http");
    }
  }
}

この実行結果は、「http」と出力されます。

正規表現は間違えているのか?とか、
何が間違えているのかを必死に探してて、ドはまりしてました。

原因

Stringクラスにある「matches」メソッドは、
完全一致の正規表現でしか、ヒットしないということでした。

その行すべてが正規表現で一致しないと、trueにならないということです。

「.*」や「.+」等を使用するイメージです。

対処法

以下のように正規表現を書けば、ヒットします。

public class RegularExpression {
  public static void main(String[] args) {
    String checkUrl = "https://inkblogdb.com";
    // SSL通信かを判定
    if (checkUrl.matches("^https://.*")) {
      System.out.println("https");
    } else {
      System.out.println("http");
    }
  }
}

この実行結果は、「https」と出力されます。

部分一致

上記で紹介したメソッド以外にも、正規表現検索できます。

「Matcher」の「find」メソッドなら、部分検索を実現できます。

public class RegularExpression {
  public static void main(String[] args) {
    String checkUrl = "https://inkblogdb.com";
    // 正規表現を定義
    Pattern pattern = Pattern.compile("https://");
    // マッチ結果を保存
    Matcher matcher = pattern.matcher(checkUrl);
    // SSL通信かを判定
    if (matcher.find()) {
      System.out.println("https");
    } else {
      System.out.println("http");
    }
  }
}

この実行結果は、「https」と出力されます。

最初、ハマったときと同じ正規表現で、ちゃんとヒットします。

内部処理

「String」クラスの「matches」メソッド、
内部的には「Matcher」クラスの「matches」メソッドを使っています。

まとめると、「Matcher」クラスのメソッドは、
完全一致の「find」メソッド
部分一致の「matches」メソッド
となっております。

まとめ

Javaの正規表現検索でハマった対処法でした。

知らずに使っていると、ハマるのでご注意ください。

Stringのmatchesは便利に使える反面、
罠があるのだなと、学びました。

以上、ここまで見ていただきありがとうございます。

皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。

コメント

この記事のコメントはありません。