Как использовать регулярное выражение в методе String.contains() в Java
Я хочу проверить, содержит ли строка String слова "store", "store" и "product" в этом порядке. Независимо от того, что находится между ними.
Я попытался использовать someString.contains(stores%store%product);
, а также .contains("stores%store%product");
Мне нужно явно объявить регулярное выражение и передать его методу, или я не могу вообще передать регулярное выражение?
Ответы
Ответ 1
String.contains
String.contains
работает со строкой, периодом. Он не работает с регулярным выражением. Он проверяет, отображается ли точная строка в текущей строке или нет.
Обратите внимание, что String.contains
не проверяет границы слова; он просто проверяет подстроку.
Регрессивное решение
Regex является более мощным, чем String.contains
, поскольку вы можете принудительно применять границу слова по ключевым словам (между прочим). Это означает, что вы можете искать ключевые слова как слова, а не просто подстроки.
Используйте String.matches
со следующим регулярным выражением:
"(?s).*\\bstores\\b.*\\bstore\\b.*\\bproduct\\b.*"
Регулярное выражение RAW (удалить экранирование в строковом литерале - это то, что вы получаете при печати строки выше):
(?s).*\bstores\b.*\bstore\b.*\bproduct\b.*
\b
проверяет границу слова, так что вы не получите соответствие для restores store products
. Обратите внимание, что stores 3store_product
также отклоняется, так как цифры и _
считаются частью слова, но я сомневаюсь, что этот случай появляется в естественном тексте.
Так как граница слова проверена для обеих сторон, регулярное выражение выше будет искать точные слова. Другими словами, stores stores product
не будет соответствовать регулярному выражению выше, поскольку вы ищете слово store
без s
.
.
обычно соответствует любому символу кроме нескольких новых символов строки. (?s)
в начале делает .
соответствует любому символу без исключения (спасибо Тиму Пицкеру за указание этого).
Ответ 2
matcher.find()
делает то, что вам нужно. Пример:
Pattern.compile("stores.*store.*product").matcher(someString).find();
Ответ 3
Вы можете просто использовать метод matches
для класса String.
boolean result = someString.matches("stores.*store.*product.*");
Ответ 4
Если вы хотите проверить, содержит ли строка подстроку или нет с помощью regex, то самое близкое, что вы можете сделать, это использовать find() -
private static final validPattern = "\\bstores\\b.*\\bstore\\b.*\\bproduct\\b"
Pattern pattern = Pattern.compile(validPattern);
Matcher matcher = pattern.matcher(inputString);
System.out.print(matcher.find()); // should print true or false.
Обратите внимание на разницу между match() и find(), matches() возвращает true, если вся строка соответствует заданному шаблону. find() пытается найти подстроку, которая соответствует шаблону в заданной строке ввода. Кроме того, с помощью функции find() вам не нужно добавлять дополнительное соответствие, например - (? S). * В начале и. * В конце вашего шаблона регулярного выражения.
Ответ 5
public static void main(String[] args) {
String test = "something hear - to - find some to or tows";
System.out.println("1.result: " + contains("- to -( \\w+) som", test, null));
System.out.println("2.result: " + contains("- to -( \\w+) som", test, 5));
}
static boolean contains(String pattern, String text, Integer fromIndex){
if(fromIndex != null && fromIndex < text.length())
return Pattern.compile(pattern).matcher(text).find();
return Pattern.compile(pattern).matcher(text).find();
}
1.result: true
2.result: true