2016-03-18 2 views
0

У меня есть это регулярное выражение:Как перенести последнее «начало с» с помощью регулярного выражения?

public static void main(String[] args) { 



    String str = "my name is my name is jack"; 


    pattern = "my.*?jack"; 

    pr = Pattern.compile(pattern); 

    matcher = pr.matcher(str); 
    while (matcher.find()){ 
     list.add(matcher.group(0)); 
    } 

    System.out.println (list.get(0)); 

} 

который должен соответствовать от «моего», и «гнезда». На данный момент это соответствие по всей строке, которая не является сюрпризом. Я хочу достичь: матч на последнем «моем», если «jack» не найден.

Токовый выход: мое имя, меня зовут Джек

Wanted выход: меня зовут Джек.

Я знаю, что я могу подстроить *, чтобы получить последнее значение «my», так что первое событие полностью игнорируется, но оно только сломает другую строку, которую я могу использовать, - где все события но последний удаляется.

Любая идея, как достичь этого?

Спасибо. Надеюсь, мой вопрос не слишком расплывчатый или неясный. Пожалуйста, скажите мне, если это так.

* str.substring(str.lastIndexOf("my"))

ответ

0

Вы должны использовать это негативное опережение регулярного выражение на основе:

my(?:(?!\bmy\b).)*?jack 

Здесь (?:(?!\bmy\b).)* соответствует любому символу, если следующей позиция не имеет my, таким образом, убедившись, что там нет ни одного случая my от my и jack

\b для границы слова.

RegEx Demo

+0

Или избавиться от ленивого квантора вообще с 'мой ((\ Ь (:?!? Мой | домкрат) \ б).) * jack'. –

0

, если я правильно понял ваш вопрос: р попробовать следующее

public class Main { 
    public static void main(final String[] args) throws IOException { 
     final String str = "my name is my name is jack"; 

     final Pattern pattern = Pattern.compile(".*(my.*?jack)", Pattern.CASE_INSENSITIVE); 
     final Matcher matcher = pattern.matcher(str); 
     if (matcher.find()) { 
      System.err.println(matcher.group(1)); 
     } 

    } 
} 
Смежные вопросы