Javaの正規表現検索でハマったこと
ハマったこと
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は便利に使える反面、
罠があるのだなと、学びました。
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。