Java регулярное выражение найти только одно совпадение - PullRequest
0 голосов
/ 10 октября 2019

Я использую следующее регулярное выражение:

(?<=<((Pswrd>)|([^/]{1,2147483646}?:Pswrd>)))((?s).+?)(?=</(\\1))

И у меня есть следующий текст для сопоставления:

<abc:Pswrd>PASSWORD_ONE</abc:Pswrd>
<Pswrd>PASSWORD_TWO</Pswrd>

Мне нужно сопоставить контекст обоих тегов XML, ноработает только для второго.

Вывод:

PASSWORD_TWO

И он должен быть:

PASSWORD_ONE
PASSWORD_TWO

Кажется, что OR по какой-то причине не работает?

 String message = "    <abc:Pswrd>PASSWORD_ONE</abc:Pswrd>\n" +
            "    <Pswrd>PASSWORD_TWO</Pswrd>";

String regex = "(?<=<((Pswrd>)|([^/]{1,2147483646}?:Pswrd>)))((?s).+?)(?=</(\\1))";
Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(message);
while (matcher.find()) {
    String group = matcher.group();
    System.out.println(group);
}

Спасибо

Обновление: должна быть соответствующая группа 0.

1 Ответ

0 голосов
/ 10 октября 2019

Таким образом, чтобы соответствовать <Pswd> или <abc:Pswd> или <something:Pswd>, RegEx должен выглядеть примерно так: <\w*:*Pswrd>. Проблема, однако, в том, что при взгляде сзади не нравятся квантификаторы нефиксированной ширины, поэтому вы не можете создать взгляд за тем, чтобы удовлетворить «динамический»

Вместо этого я бы предложил просто пойти на что-то простое, такоеas:

(?<=Pswrd>)(.*)(?=<\/)

По сути, здесь вы просто ищете последний бит открывающего тега (а именно " Pswrd> "), затем вы сопоставляете любую вещь между этим и закрывающей частьютег.

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