Подтвердить что ты не робот

Почему я должен указать целую строку в регулярном выражении Java?

Предположим, у меня есть строка:

String str = "some strange string with searched symbol";

И я хочу найти в нем некоторые символы, предположим, что это будет "string". Итак, у нас есть следующее:

str.matches("string"); //false
str.matches(".*string.*"); //true

Итак, как указано в заголовке, почему я должен указать целую строку в регулярном выражении Java?

Документация Java говорит:

public boolean matches (регулярное выражение строки)

Сообщает, соответствует ли эта строка данному регулярному выражению.

Он не говорит

Сообщает, соответствует ли эта строка целой данному регулярному выражению.

Например, в php это будет:

$str = "some strange string with searched symbol";
var_dump(preg_match('/string/', $str)); // int(1)
var_dump(preg_match('/.*string.*/', $str)); //int(1)

Итак, оба регулярных выражения будут true.
И я думаю, что это правильно, потому что, если я хочу протестировать целую строку, я бы сделал str.matches("^string$");

PS: Да, я знаю, что это поиск подстроки , проще и быстрее будет использовать str.indexOf("string") или str.contains("string"). Мой вопрос касается только регулярного выражения Java.


ОБНОВЛЕНИЕ. Как указано в @ChrisJester-Young (и @GyroGearless), одно из решений, если вы хотите найти regex, который является частью строки темы, заключается в использовании find() метод, подобный этому:

    String str = "some strange string with searched symbol";
    Matcher m = Pattern.compile("string").matcher(str);
    System.out.println(m.find()); //true
4b9b3361

Ответ 1

matches всегда соответствует всей строке ввода. Если вы хотите разрешить подстроки, используйте find.

Ответ 2

В качестве документации, которую вы предлагаете,

public boolean matches (регулярное выражение строки)

Указывает, соответствует ли эта строка данному регулярному выражению.

Что это означает, соответствует ли эта строка заданному регулярному выражению. т.е. matches проверяет, является ли ваша строка экземпляром данного регулярного выражения.

не содержит ли он подстроку, которая является экземпляром данного регулярного выражения. Как сказал Крис, вы можете использовать find вместо или для своей проблемы, вы можете использовать contains.

Ответ 3

Да, как вы уже знаете (сейчас), что matches() вернет true только для полной строки.

Но в своем обновлении вы заявили, что:

Как указано @ChrisJester-Young (и @GyroGearless), единственным решением, если вы хотите искать регулярное выражение, которое является частью строки темы, является использование метода find()...

Я хотел бы сказать, что использование find() не единственное решение. Есть, по крайней мере, еще один, который я знаю:

String str = "some strange string with searched symbol";
boolean found = str.split("string").length>1;
System.out.println(found);

Отпечатает true. И это будет работать для всех регулярных выражений. Хотя это не способ сделать это, а вместо этого взломать.

Там может быть много других решений.