我在 Windows 7 操作系统上使用 Cygwin。
我正在尝试匹配以下格式的电子邮件:x.y@enron.com
这是我的正则表达式:
grep [a-zA-Z0-9]+\.[a-zA-Z0-9]+@(E|e)nron\.com
它返回
-bash: syntax error near unexpected token `('
它在使用时有效正则表达式101.com
它应该匹配诸如[email protected]
和 之类的电子邮件[email protected]
答案1
[
、\
、(
以及)
所有这些对 shell 都有特殊含义,如果您打算将它们在命令的参数中逐字传递(此处grep
),则应加引号。
另请注意,诸如此类的范围[a-z]
在 C 语言环境之外没有什么意义。
所以在这里,您可能想要:
LC_ALL=C grep -xE '[[:alnum:]]+\.[[:alnum:]]+@(E|e)nron\.com' < some-file
或者:
LC_ALL=C grep -xE '[[:alnum:]]+\.[[:alnum:]]+@[Ee]nron\.com' < some-file
E
报告与扩展正则表达式 e相匹配的行x
。al
数字字符num
仅限于语言环境的字符C
(在 Cygwin 上,没有变音符号的 ASCII 英语/拉丁字母和阿拉伯十进制数字;在 C 语言环境中[[:alnum:]]
和[a-zA-Z0-9]
匹配相同的东西)。
上面使用了'...'
最强的引用形式(其中没有特殊的字符)。
+
,|
,(...)
是扩展正则表达式运算符(不是基本的正则表达式运算符如grep
without所预期的那样-E
)。没有-x
,grep
会寻找匹配项之内行,因此例如会匹配如下行:
[email protected] [email protected] whatever
^^^^^^^^^^^^^
如果没有LC_ALL=C
,[[:alnum:]]
可以匹配其他字母文字的字符(如希腊语、西里尔字母、韩语),并且[a-z]
可以匹配一些带有变音符号的拉丁字符,如á
, ç
,ÿ
但不能匹配其他字母ẑ
,ź
如 ,后 z
...