2014-10-12 5 views
0

Если String X содержит String Y, тогда верните все слово, которое содержит String Y. Идея состоит в том, что RegEx должен определить, что является целым словом, я предполагаю, что регулярное выражение будет искать пробельные.Сохраните все слово, используя RegEx

String whole = "BARA BERE"; 
String part = "BAR"; 

if (whole.contains(part)) { 
    result = whole.replaceAll("\\bBAR", ""); 
    System.out.println(result); 
} 

Вывод должен быть: Бара

Q1: Что такое регулярное выражение в этом случае?

Q2: Какое будет регулярное выражение, если слова разделены новыми строками?

ответ

1

Матч с этим регулярным выражением:

(?=\S*?BAR)\S+ 

Это утверждает, что непробельная последовательность включает слово "BAR".

String whole = "foo foobar barfoo baz"; 
String part = "foo"; 

Matcher matcher = Pattern.compile("(?=\\S*?" + part + ")\\S+").matcher(whole); 

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

Вы получаете:

Foo
Foobar
barfoo

Вы также можете процитировать буквального раздел с \Q\E если ваша строка содержит мета-символы:

(?=\S*?\Q%s\E)\S+ 
String whole = "Dr Smith."; 
String part = "th."; 
Matcher matcher = Pattern.compile(String.format("(?=\\S*?\\Q%s\\E)\\S+", part)).matcher(whole); 

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

# Несовместимые типы: Образец не может быть преобразован в Matcher – Insanovation

+1

@insanovation Я обвиняю своего котенка, который ввел для меня новую строку, когда я собирался заполнить декларацию сопряжения. Исправлено. Благодаря! – Unihedron

+0

Мне также нужна операция с игнорированием. Например: String part = "TH.". – Insanovation

2

Если вы ищете слово, вы не должны использовать .replaceAll(), но .find(). Так как вы указали, по крайней мере, это моя интерпретация), что «слово» должно заканчиваться на ближайшей символ пробела, вы можете сделать это:

Pattern regex = Pattern.compile("\\bBAR\\S*"); 
Matcher regexMatcher = regex.matcher(whole); 
if (regexMatcher.find()) { 
    part = regexMatcher.group(); 
} 

\S* соответствует нулю или более не пробельных символов (что также исключает новой строки).

Если вы хотите разрешить пробелы, но запретите новые строки в «слове», используйте [^\r\n] вместо \S.

+0

Спасибо, но что вы думаете о Q2: что будет с регулярным выражением, если слова разделены новыми строками? – Insanovation

+0

@insanovation сообщение пример .. –

0

регулярное выражение должно быть

\bBAR\w*?\b 

\b утверждает границу слова.

здесь предполагая part струна как BAR

. *? соответствует любому количеству символов в ленивом образе. То есть до тех пор, пока не найдет следующую границу слова \b

+0

@Unihedron ok,' \ w' будет лучше. отредактировал Спасибо :) – nu11p01n73R

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