2013-02-14 5 views
3

У меня есть файл с кучей различных кодов ZIP:Regex чтобы соответствовать ZIP код без пунктуации

12345 
12345-6789 
1234567890 
12345:6789 
12345-7890 
12:1234678 

Я хочу соответствовать только по кодам, которые имеют формат 12345 или 12345-6789, но игнорировать все другие формы.

У меня есть регулярное выражение, как:

grep -E '\<[0-9]{5}\>[^[:punct:]]|\<[0-9]{5}\>-[0-9]{4}' samplefile

Он совпадает с 12345-6789, потому что «или» положение соответствует по этому конкретному одному. Я смущен, почему он не будет совпадать с первым 12345, так как мое выражение должно сказать «совпадение по 5 номерам, но игнорировать любую пунктуацию».

ответ

9

Выражения, которое соответствует вашим желаемым результатам является:

egrep "^[0-9]{5}([-][0-9]{4})?$" samplefile 

Разбивка выражения:

^[0-9]{5} - Найдите строку, которая начинается с 5 цифрами. ^ означает начало строки и [0-9]{5} означает ровно пять цифр от нуля до девяти.

([-][0-9]{4})?$ - Может закончиться тире и четырьмя цифрами или вообще ничего. () группирует выражения вместе, [-] представляет символ штриха, [0-9]{4} представляет ровно четыре цифры от нуля до девяти, ? указывает, что сгруппированное выражение существует полностью или не существует, а $ обозначает конец строки.

test.dat

12345 
12345-6789 
1234567890 
12345:6789 
12345-7890 
12:1234678 

Запуск выражение на тестовых данных:

[email protected]:~$ egrep "^[0-9]{5}([-][0-9]{4})?$" test.dat 
12345 
12345-6789 
12345-7890 

Дополнительная информация: grep -E альтернативно может быть записана в виде egrep. Это также работает для grep -F, который совпадает с fgrep и grep -r, который совпадает с rgrep.

+0

Имеет смысл. Я пытался сделать это наоборот, вместо того, чтобы идти с самого начала. Оценил. – Paul

0

Он не будет соответствовать «12345», но будет соответствовать «12345a». Первое предложение должно заканчиваться символом без пунктуации, как вы его написали.

Рассмотрите ответ Майка; это яснее.

Смежные вопросы