ack regex: сопоставление двух слов по порядку в одной строке - PullRequest
22 голосов
/ 10 апреля 2011

Я хотел бы найти строки в файлах, которые содержат два слова, word_1 и word_2 по порядку, например, в Line A ниже, но не как в Line B или Line C:

Line A: ... word_1 .... word_2 .... 
Line B: ... word_1 ....
Line C: ... word_2 ....

Я пробовал

$ack '*word_1*word_2'
$ack '(word_1)+*(word_2)+'

и те же команды с добавлением ^ в начале регулярного выражения (в попытке следовать синтаксису регулярного выражения Perl).

Ни одна из этих команд не возвращает интересующие меня файлы или строки.

Что я делаю не так?

Спасибо!

1 Ответ

40 голосов
/ 10 апреля 2011

Вы хотите найти word_1, затем что угодно, любое количество раз, а затем word_2. Это должно быть

word_1.*word_2

Вы, похоже, используете *, поскольку он часто используется при поиске в командной строке, но в регулярных выражениях это квантификатор для предыдущего символа, то есть соответствует ему как минимум 0 раз. Например, регулярное выражение a* будет соответствовать 0 или более a с, тогда как регулярное выражение a+ будет соответствовать по крайней мере одному a.

Метасимвол regex, означающий «соответствовать чему-либо», равен ., поэтому .* означает «соответствовать чему-либо, любое количество раз. См. perlrequick для краткого введения в тему.

...