我使用以下正则表达式查找电子邮件地址:
echo "[email protected]" | awk '/^([a-zA-Z0-9_-.\+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$/ {print $0}'
但它返回错误:
awk: cmd. line:1: error : tent of \{\}
我使用以下正则表达式查找电子邮件地址:
echo "[email protected]" | awk '/^([a-zA-Z0-9_-.\+]+)@([a-zA-Z0-9_-.]+).([a-zA-Z]{2,5})$/ {print $0}'
但它返回错误:
awk: cmd. line:1: error : tent of \{\}
回答:
解释: 这个字符
-
在你放置它的位置是模棱两可的,因为它可能代表一个区间。将它移动到正则表达式的开头,或者转义它,效果很好。更多信息:如有疑问, 请在这个有用的网站上检查您的正则表达式。
正如Isaac正确指出的那样,表达式中的最后一个点并不像您认为的那样:
.
代表任何字符,如果您希望它表示文字点,则应将其转义\.
进一步的优化包括不在括号内转义字符,因为它是不必要的。我
\+
在第一个字符集中指向,我必须再次感谢Isaac发现这一点!我无法理解的另一件事是为什么要使用所有这些圆括号
()
。除了更正使用
-
并提出一些小的改进之外,这里的基本主题是使用正则表达式来验证电子邮件地址的广泛讨论的机会。正确匹配任何电子邮件地址是一项艰巨的任务,需要比人们最初想象的复杂得多的表达式。在这个论坛和类似论坛上经常发现的一个合理的做法是使用最简单的正则表达式,它有望与您的数据集一起使用。短版,使用这个:
假设实际的错误消息类似于:
然后,您的行中有 4 个问题:
破折号 (
-
) 表示“字符范围”而不是明确的破折号。-
错误消息的原因是字符范围 (_
和) 内的破折号 ( ) 周围的两个字符.
不是 (ASCII) 顺序。字符范围.-_
不会引发错误。但我确信您的意思不是说“字符范围”(点.
和下划线之间的所有字符_
),而是要匹配明确的破折号(-
)。要匹配“括号表达式”内的显式破折号,您需要将其设为范围的第一个或最后一个字符。要么
[-…]
,[…-]
。或者,气馁,逃避它\-
。也就是说,这两个工作:但是不,反斜杠不是明确破折号的一般解决方案。尝试:
grep 正则表达式(即使扩展:)
-E
与破折号不匹配。在“括号表达式”
+
中并不特殊,因此,它不需要转义(并且在“括号表达式”中转义是一个坏习惯)。用这个:点
.
是“匹配除换行符以外的任何字符”的特殊字符。因此,您需要对其进行转义
\.
或使用“括号表达式”[.]
来显式匹配点字符,请使用以下命令:最后,“间隔表达式”是对历史 awk 实现的扩展,它可能不适用于所有 awk。这通常“不是问题”,但如果是,您将需要使用:
但是您可能正在使用 GNU awk,那么正确的语法应该是:
连字符
-
是字符类(括号表达式)中的特殊字符,用于指定字符范围。如果您想将文字添加-
到您的字符类中,您需要将其转义或将其移动到字符类的末尾或开头(^
如果有的话)。你用的是哪个版本的
awk
?当我使用 GNU 时,此命令不会出错
awk
,尽管它不会产生任何输出。使用
solaris
awk
它会产生这个错误:通读你的
regex
,它永远不会匹配一个电子邮件地址......