2017-01-10 2 views
1

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

В java, скажем, у меня есть слово «BSD». И я хотел бы обнаружить любое предложение, которое имеет слово «лицензия» до или после слова «BSD». Слово «лицензия» является обязательным. Как это сделать в Java Regex?

Это, насколько я знаю.

String REGEX = "(?i)(GNU)(\\s)+(license)?"; 
String contents1 = "This file is using GNU license."; 
m = Pattern.compile(REGEX).matcher(contents1); 
m.find(); 
System.out.println(m.group()); 

String contents2 = "This licensed using GNU version 2 ."; 
m = Pattern.compile(REGEX).matcher(contents2); 
m.find(); 
System.out.println(m.group()); 
+1

Итак, вы хотите совместить строку, содержащую слова 'license' и' GNU' в любом порядке? Например. 'String REGEX ="^(? =. * Лицензия). * GNU ";'? –

+0

Вы имели в виду GNU? –

+1

См. Http://ideone.com/ZLekGX –

ответ

1

Вы можете проверить, если строка содержит как license и GNU (или BSD, что вы используете, зависит от ваших данных и то, что вам нужно, чтобы соответствовать), используя

String REGEX = "^(?=.*license).*GNU"; 
String contents1 = "This licensed using GNU version 2 ."; 
Matcher m = Pattern.compile(REGEX).matcher(contents1); 
if (m.find()) { 
    System.out.println("Found!"); 
} 

См this Java demo.

картина соответствует:.

  • ^ - начало строки
  • (?=.*license) - положительному, что требует касательно последующей последовательности буквенных символов license после любых 0+ символов (не включая разрыв строки символов если какой-либо dotall модификатор не используется)
  • .* - любые 0+ символов как можно больше до последнего
  • GNU - буквальная последовательности полукокса.
1

Если вы просто хотите Regex выражение для проверки комбинации "... GNU License ..." и "... Лицензия GNU ..." вы можете попробовать что-то вроде этого:

String a = "abc GNU License 213"; 
String b = "abc License GNU 123"; 

Pattern patternA = Pattern.compile("^.*(((GNU)\\s(License))|((License)\\s(GNU))).*$"); 
Matcher matcherA = patternA.matcher(a); 

    if (matcherA.matches()) { 
     System.out.println("matcherA matched"); 
    } 

Pattern patternB = Pattern.compile("^.*(((GNU)\\s(License))|((License)\\s(GNU))).*$"); 
Matcher matcherB = patternB.matcher(b); 

    if (matcherB.matches()) { 
     System.out.println("matcherB matched"); 
    } 

Он соответствует любому количеству символов, за которым следует либо «Лицензия GNU», либо «Лицензия GNU», за которой следует любое количество символов.

+0

Спасибо @mind. Но я думаю, что более «расслабленным» лучше. – RonPringadi

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