Назад | Перейти на главную страницу

Значение * в базовом регулярном выражении по сравнению с расширенным регулярным выражением

Я думал, что * означает ноль или более символов или классов, предшествующих ему в базовом или расширенном регулярном выражении. Почему echo hello| grep '*llo' потерпеть неудачу, но echo hello |egrep '*llo' добиться успеха?

При использовании grep / egrep / fgrep вы можете включить -o флаг, чтобы grep возвращал только совпавшие символы. (если у вас красивый цветной терминал, вы также можете попробовать --color чтобы выделить совпадение в возвращаемых строках. В таких случаях это часто помогает.

echo "that star " | grep -o '*count'
echo "that star " | egrep -o '*count'
echo "that star " | fgrep -o '*count'
echo "that star counted" | grep -o '*count'
echo "that star counted" | egrep -o '*count'  ## returns "count"
echo "that star counted" | fgrep -o '*count'
echo "that star *counted" | grep -o '*count'  ## returns "*count"
echo "that star *counted" | egrep -o '*count'  ## returns "count"
echo "that star *counted" | fgrep -o '*count'  ## returns "*count"

Без комментариев ничего не вернули.

Таким образом, разница в том, что старые парсеры grep и fgrep, когда они не видели символа или набора перед звездочкой, предпочитали рассматривать его как нормальный символ для сопоставления. egrep рассматривает его как неработающий или недействительный и продолжает молча.

(еще одно замечание, я иногда использую pcregrep для совместимости с регулярными выражениями Perl, и на самом деле он выдает сообщение об ошибке, когда регулярное выражение начинается со звездочки!)

http://www.regular-expressions.info/repeat.html

http://www.robelle.com/smugbook/regexpr.html

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

Другими словами, вы должны сказать echo hello | grep 'llo*' чтобы найти «llo» или «lloooo» и т. д., чтобы сопоставить больше букв в шаблоне, заключите его в круглые скобки. (llo) * найдет llo, llollo и т. д.

Я предполагаю, что grep с * не работает, потому что это недопустимое регулярное выражение, а egrep просто игнорирует *.