Переписать RegEx для использования в Java - PullRequest
1 голос
/ 10 марта 2019

Я написал (?<=pp_).*(?=') регулярное выражение, чтобы соответствовать тому, что следует после pp_ в строках типа

['newPage', 'pp_vii', -1]

Мой regex отлично работает в онлайн-тестировщиках (см. онлайновый валидатор regex ), но в Java это не так. Мой ошибочный код:

Pattern pattern = Pattern.compile("(?<=pp_).*(?=')");
String input = "['newPage', 'pp_vii', -1])";
Matcher m = pattern.matcher(input);
boolean match = m.matches(); // false

Ответы [ 2 ]

1 голос
/ 10 марта 2019

Метод matches() проверяет полное совпадение строк, поэтому вместо этого используйте метод find(), который проверяет соответствие подпоследовательности.Наконец, вы можете использовать метод group() для получения подходящей строки подпоследовательности.

public static void main(String[] args) {
Pattern pattern = Pattern.compile("(?<=pp_).*(?=')");
String input = "['newPage', 'pp_vii', -1])";
Matcher m = pattern.matcher(input);
boolean a = m.find(); 

if(a){
    String out = m.group();
    System.out.println("Match : " + out);
}
0 голосов
/ 10 марта 2019

С вашим регулярным выражением все в порядке.Метод Matcher.matches() возвращает true, только если полная строка соответствует шаблону ( docs ).Вы должны использовать Matcher.find() вместо этого.Это находит следующую подпоследовательность, которая соответствует шаблону ( документы ).

Pattern pattern = Pattern.compile("(?<=pp_).*(?=')");
String input = "['newPage', 'pp_vii', -1])";
Matcher m = pattern.matcher(input);
boolean stringMatches = m.matches(); // false
boolean isThereMatch = m.find(); // true
System.out.println(isThereMatch + " " + stringMatches);
System.out.println(m.group());

Это печатает:

true false
vii
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...