2015-07-23 2 views
1

Я хочу получить часть строки, содержащую одно из целевых слов. Так, например, из следующего примера строки:Java регулярное выражение, чтобы получить часть строки

... 
def a: 
... 
target1 
... 
def b: 
... 
def c: 
... 

Я хочу, чтобы получить эту часть:

def a: 
... 
target1 
... 

Вот мой Java код:

s = "(def\\W(.*)\\W(target1|target2|target3)\\W(.*)def\\W)"; 
Pattern p = Pattern.compile(s); 
Matcher m = p.matcher(sourceString); 

while(m.find()){ 
    System.out.println(m.group(0)); 
} 

Проблема заключается в том, что она не узнайте что-нибудь.

Большое вам спасибо за помощь!

+1

И ваш вопрос? В чем проблема с вашим кодом? – tnw

+0

@tnw В настоящий момент код ничего не распечатывает. – Ryan

+0

@Ryan .. Я не уверен, что это сработает для вас, но вы можете попробовать что-то вроде «(def. * (Target1 | target2 | target3))» – digidude

ответ

1

Вы можете использовать:

Pattern p = Pattern.compile(
    "(\\bdef\\s((?!\\bdef\\b).)*?\\b(?:target1|target2|target3)\\b.*?(?=sdef))", 
    Pattern.DOTALL); 

RegEx Demo

+0

большое спасибо. Это выглядит великолепно, только сейчас есть одна проблема. если вход следующий: он отображает несколько «def». ... Защиту б: ... Защиту: с ... target1 ... Защиту б: ... четкости с: ... – Ryan

+0

хорошо попробовать мой обновленный регулярное выражение в настоящее время. – anubhava

1

По умолчанию . представляет любой символ ожидать разделители строк. Чтобы сделать точку, принимайте все символы, добавьте флаг Pattern.DOTALL.

Pattern p = Pattern.compile(s,Pattern.DOTALL); 

Вы также можете сделать .* неохотой с .*?.

Вы можете использовать регулярное выражение как

String s = "(def\\W(.*?)\\W(target1|target2|target3)\\W(.*?))def\\W"; 
//   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - group 1 

и внутри использования петли m.group(1) вместо m.group(0)

+0

спасибо! Я добился определенного прогресса в вашем решении. Прямо сейчас есть еще одна проблема. «def» теперь отображается несколько раз. Anywhy я могу ограничить «def» происходит только дважды? – Ryan

+0

Вы пытались использовать '. *?' Вместо '. *'? – Pshemo

1

Попробуйте что-то вроде этого -

# "(?ms)^def\\b(?:(?!^def\\b).)*?\\b(target[123])\\b(?:(?!^def\\b).)*" 

(?ms)       # Multi-line and Dot-all modes 
^ def \b      # 'def' 
(?: 
     (?!^def \b)    # Not 'def' 
     . 
)*? 
\b 
(target [123])    # (1), 'target 1 or 2 or 3 
\b 
(?: 
     (?!^def \b)    # Not 'def' 
     . 
)* 

Выход:

** Grp 0 - (pos 0 , len 27) 
def a: 
... 
target1 
... 

** Grp 1 - (pos 13 , len 7) 
target1 
Смежные вопросы