#java #regex
#java #регулярное выражение
Вопрос:
Привет, у меня есть следующее предложение, которое находится в гораздо большей строковой переменной:
New Component <b>TEST</b> is successfully registered.
Я пытаюсь выполнить сопоставление регулярных выражений, чтобы найти это предложение в строке. Слово TEST является переменным и может быть любым словом.
Я использую следующий шаблон в regexr, который работает нормально:
New Component <b>w*</b> is successfully registered.
В моем Java-коде я должен записать это как
Pattern p = Pattern.compile("New Component <b>\w*<\/b> is successfully registered.");
Matcher m = p.matcher(result.toString());
if (m.matches()) {
System.out.println("hurray!");
}
Это потому, что мне нужно экранировать обратную косую черту. Однако шаблон не получает соответствия в коде php, и hurray не печатается. Есть ли проблема с обратными косыми чертами или тем, как я их использовал здесь, что приводит к сбою сопоставления?
Комментарии:
1. ваш код — это что угодно, но не php — для меня больше похоже на Java? кроме того, это не из-за экранирования, а потому, что вы не указали группу захвата. попробуйте
New Component <b>(w*)</b> is successfully registered.
2. Извините, что вы правы, это должна быть java, а не php
3. Я попробовал предложенный вами шаблон, но он все еще не работает, если он соответствует в regexr, хотя шаблон, который я использовал, должен быть в порядке, верно?
4. попробуйте regex101.com — он также поставляется с удобной функцией генератора кода, которая даже поддерживает Java
Ответ №1:
Попробуйте добавить .*
в начало и конец шаблона:
Pattern p = Pattern.compile(".*New Component <b>\w*<\/b> is successfully registered..*");
Ваш шаблон пытается сопоставить строку, однако он не будет соответствовать, поскольку он является частью строки большего размера, поэтому любые символы до или после целевой строки не будут приняты регулярным выражением и приведут к сбою.
.*
сообщает сопоставителю принять 0 или более ЛЮБОГО символа до и после вашей целевой строки.
Редактировать: Также, если вы хотите сопоставить точку в конце строки, вы должны экранировать точку с .
, это потому, что точка имеет особое значение в регулярном выражении, это означает любой символ.
Ответ №2:
В дополнение к ответу @dahui другим вариантом является переключение m.matches()
с m.find()
помощью.
.matches()
требуется, чтобы регулярное выражение соответствовало всей строке. .find()
требуется, чтобы регулярное выражение соответствовало любой подстроке строки.
Редактировать: при выполнении следующего печатается «ура!», когда я его запускаю:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SO {
public static void main(String[] args) {
Pattern p = Pattern.compile("New Component <b>\w*<\/b> is successfully registered.");
Matcher m = p.matcher("New Component <b>TEST</b> is successfully registered.");
if (m.matches()) {
System.out.println("hurray!");
}
}
}
Возможно ли result.toString()
, что это не то, что вы думаете?
Комментарии:
1. Изменение его на m.find устраняет проблему, так что спасибо за это!