2014-10-20 3 views
0

я следующие строки в текстовом файле (простой пример, фактический текстовый файл я должен работать в 7.000 линии длинной):Regex - поиск 2-х слова в строке

  1. Доставка кухни прибыла
  2. Во второй половине дня папу помог установить кухню, и мы работали до конца до полуночи
  3. Позже папа съел бутерброд с сыром

Я пытаюсь использовать регулярное выражение для поиска любых строк, содержащих слово «Папа» и «Кухня». Они не должны быть рядом друг с другом, а просто где-то на линии.

В приведенном выше примере должна быть найдена только вторая строка.

Я пробовал:

[kitchen] dad 

Но что соответствует 2-й и 3-й линии, по-видимому, потому что [кухня] говорит найти все строки, содержащие любой из этих символов, а не слово целиком, а и слова, содержащие «папа».

Я также попытался:

[\bkitchen\b] dad 

Но это не работает.

Извините, что не поставил на этот вопрос вопрос, но я не уверен, почему я стараюсь задавать четкие вопросы. .

Любой совет, который очень ценится.

Благодаря

+2

Зачем использовать регулярное выражение? Большинство языков программирования имеют какую-то функцию _contains/indexOf_ для строк, которые сделаны именно для этого – BlackBear

ответ

0

Либо папа следует кухней:

dad.*kitchen 

Или кухня следует папу:

kitchen.*dad 

Положив два вместе:

(dad.*kitchen|kitchen.*dad) 

Кроме того, помните о чувствительности к регистру.

1

Вы можете попробовать ниже регулярное выражение, которое использует lookarounds. И не забудьте включить модификатор i, чтобы сделать нечувствительность к регистру.

^(?=.*?\bkitchen\b)(?=.*?\bdad\b)(?!\bkitchen\sdad\b|\bdad\skitchen\b).* 

DEMO

+1

Я не вижу причины для '(?! \ Bkitchen \ sdad \ b \ \ bdad \ skitchen \ b)' does not OP только хочет проверить наличие обоих слов? –

+0

'Они не должны быть рядом друг с другом', обновили мою демонстрационную ссылку. –

0

следующее регулярное выражение будет делать то, что вы просили, но BlackBear прав, большинство языков программирования предоставляют простой способ определить, является ли строка текста содержит подстроку.

^.*(?:dad.*kitchen|kitchen.*dad).*$ 

Примечание: выражение всегда будет соответствовать всей строке.

Обязательно используйте флаг i во время совпадения, чтобы обеспечить совпадение без учета регистра.
Alternativly вы можете использовать изменить выражение как это:

^(?i).*(?:dad.*kitchen|kitchen.*dad).*$ 

Demo

0

Использование lookahead, это регулярное выражение должно работать.

(?:(?=\bdad\b).*(?=\bkitchen\b).*)|(?:(?=\bkitchen\b).*(?=\bdad\b).*) 

DEMO