3

Теперь у меня есть три строки для сопоставления с одним re - 'a', 'ab', 'ac' Я полагаю, одно правильное re должно быть 'a [bc]?', но это кажется не правильно. Что является правильным?

Я пробую это в команде grep. А похоже что нету?'в регулярном выражении Грепа. Так как же сделать это сопоставление в grep?

Благодаря @anubhava теперь я могу сопоставить все эти три строки:

grep -E 'a[bc]?' <file>

Однако это выражение также соответствует «ad».

На самом деле, я хочу сопоставить все эти ситуации:«a», «abc», «ab», «ac», но не хочу сопоставлять «ad» или «ae»

3 ответа3

3

Если вы хотите использовать вышеизложенное в команде grep, используйте переключатель расширенной поддержки регулярных выражений -E с границами слова:

grep -E "\ba[bc]?\b" file

ИЛИ ЖЕ

grep -E "\<a[bc]?\>" file
3

Чтобы использовать это выражение в основном режиме, вам нужно экранировать знак вопроса:

grep 'a[bc]\?' file

Обновить

Чтобы ответить на ваш последний вопрос, я бы посоветовал использовать режим P(erl):

grep -P 'a(?![de])|a[bc]|abc'

Это чередования:

  1. Совпадение с «a», если за ним не следуют «d» или «e» (используется отрицательный прогноз)

  2. Совпадение "ab" или "ac"

  3. Матч 'abc'

2

Если вы хотите, чтобы строка соответствовала регулярному выражению от начала до конца, вам необходимо включить в регулярное выражение маркеры начала ^ и конца $

^a[bc]?$

Если маркеры не являются частью регулярного выражения, 123ab456 будет соответствовать регулярному выражению.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .