Сопоставьте следующее с регулярными выражениями - PullRequest
0 голосов
/ 20 октября 2011

Мне нужно сопоставить следующую строку с регулярными выражениями в Java:

Здравствуйте: $ {firstName} $ {lastName}

И получите это:

$ {FirstName}

* * 1013 $ {LastName} * * 1015

Я пробовал это:

@Test
    public void testRegexMatch() {
        String regex = Pattern.quote("${") + ".+" + Pattern.quote("}");
        String str = "Hello: ${firstName} ${lastName}";
        Matcher m = Pattern.compile(regex).matcher(str);
        while (m.find()) {
            System.out.println(str.substring(m.start(), m.end()));
        }
    }

Но я получил следующий вывод:

$ {firstName} $ {lastName}

Ответы [ 5 ]

2 голосов
/ 20 октября 2011

Следующее будет соответствовать $ {что-нибудь}

(\$\{[^\}]+\})
2 голосов
/ 20 октября 2011

попробуйте заменить .+ на [^\}]+.который будет соответствовать как можно большему количеству не } символов.

Также важно отметить, что этот метод лучше, чем использование не жадного квантификатора .+?, поскольку он будет совпадать без обратного отслеживания,в то время как не жадная версия будет возвращаться один раз за символ в скобках.В этом случае вы, вероятно, не заметите снижения производительности, но важно иметь привычку писать наиболее эффективные из возможных регулярных выражений

1 голос
/ 20 октября 2011

+ является жадным квантификатором и соответствует как можно большему количеству входных данных, поэтому ваше регулярное выражение будет соответствовать до } из ${lastName}. Итак, вам нужно использовать квантификатор с неохотой, который равен ?, и он должен работать нормально. Вам просто нужно изменить свою первую строку кода следующим образом

String regex = Pattern.quote("${") + ".+?" + Pattern.quote("}");

1 голос
/ 20 октября 2011

Попробуйте с:

public void testRegexMatch() {
    String regex = Pattern.quote("${") + "(.+?)" + Pattern.quote("}");
    String str = "Hello: ${firstName} ${lastName}";
    Matcher m = Pattern.compile(regex).matcher(str);
    while (m.find()) {
        System.out.println(m.group(1));
    }
}
0 голосов
/ 20 октября 2011
String test = "Hello: ${firstName} ${lastName}";    
Pattern p = Pattern.compile("\\Q${\\E[a-zA-Z]*\\Q}\\E");
Matcher m = p.matcher(test);
while(m.find()){
    System.out.println(m.group());
}

заменить

[a-zA-Z]*

с тем, что вы хотите

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