Как экранировать символ трубы в Pattern.compile () - PullRequest
0 голосов
/ 11 ноября 2019

У меня проблема с экранированием символа канала (|) при использовании Patter.comile (). У меня есть код:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Scratch {

    static String finPatternWithPipe() {
        String text = "123|FirstName=First|SecondName=Second|567";
        Pattern pattern = Pattern.compile("FirstName=(.*)\\|");
        Matcher matcher = pattern.matcher(text);
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
        return null;
    }

    public static void main(String[] args) {
        Scratch.finPatternWithPipe();
    }
}

и я хочу получить результат " First ", но фактический результат - " First | SecondName = Second ". Если я изменю код и вместо этого регулярное выражение " FirstName = (. ) \ | *" use " FirstName = (. ) \ | S *", так что результатбудет таким, как я ожидал " Первый ". В чем моя проблема? Я хочу использовать символ конвейера как последний символ, который я хочу видеть в моей строке регулярного выражения, но не понимаю, как это сделать.

1 Ответ

3 голосов
/ 11 ноября 2019

Вам нужно сделать квантификатор не жадным:

Pattern.compile("FirstName=(.*?)\\|")
                              ^ add this

В противном случае .* соответствует максимально возможному количеству символов, включая символы канала.

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