Возможная проблема с экранированием обратной косой черты при попытке выполнить регулярное выражение

#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 устраняет проблему, так что спасибо за это!