两种格式的电话号码,可以使用条件分支:或者(|)。还有一点要注意的就是必须在每个正则表达式的首尾加^和$,不然这样的行也会被选出来的
0(001) 345-0000
(001) 345-0000111
正确的答案:
egrep '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$|^[0-9]{3}-[0-9]{3}-[0-9]{4}$' file.txt
更好的答案:
grep -P '^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$' file.txt
为什么用egrep '^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$' file.txt就不能AC了?
但是egrep '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt 就可以AC
原因可能是egrep(扩展的正则表达式也不支持\d,只支持[0-9]),但是perl(-P)正则表达式就支持\d
参考:
Using grep
:
grep -P'^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$'file.txt
Using sed
:
sed -n -e '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt
Using awk
:
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/' file.txt