2015-07-09 3 views
0

Я хочу найти номер телефона в текстовом файле, используя grep в cygwin. Число 0570-2770521, и я использую регулярное выражение "[0-9] {4} - [0-9] {7}" с общей командой grep "[0-9]{4}-[0-9]{7}" ./list.txt, но это не сработало. Тогда я изменился на grep "[0-9]\{4\}-[0-9]\{7\}" ./list.txt, он работает!Не фигурные скобки метасимволы в регулярных выражениях в cygwin?

Но поскольку {} являются метасимволами, если они удаляются от них, они будут буквальными буквами, то как они могут представлять время совпадения [0-9]?

Имеет ли я неправильное понимание? Надеюсь, кто-то может помочь объяснить путаницу, спасибо заранее!

С уважением!

+0

В противном случае вам нужно избежать {}, тогда как в pcre вам не нужно выходить {}, чтобы использовать их как метамар –

ответ

1

man re_format:

Устаревшие ("базовые") регулярные выражения отличаются в нескольких отношениях. [...] Ограничениями для границ являются \{ и \}, с { и } сами по себе обычные символы.

Использование egrep (или, что то же самое, grep -E) для расширенных регулярных выражений, которые могут быть более знакомы.

+0

, поэтому {} является обычным символом в основном регулярном выражении, но, похоже, [] работает в основном регулярном выражении, почему {} является настолько особенным и существуют ли какие-либо метасимволы, обычные в основном регулярном выражении? Я прочитал много материалов, все они об этом не говорили. – cmjauto

+1

Потому что изначально модификаторы count не были частью regexp, они были добавлены позже (в отличие от классов символов, которые были там в значительной степени навсегда). Поэтому, чтобы сохранить обратную совместимость, они не могли внезапно продвигать '{' и '}' от обычных символов к метасимволам, потому что старые скрипты, которые использовали их как обычные символы, ломались бы. – Amadan

+0

ok, большое спасибо! – cmjauto