【问题标题】:gawk regex to find any record having characters other then the specified by character class in regex patternawk 正则表达式查找具有正则表达式模式中字符类指定以外的字符的任何记录
【发布时间】:2016-10-14 14:52:41
【问题描述】:

我有一个文本文件中的电子邮件地址列表。我有一个具有字符类的模式,它指定电子邮件地址中允许使用哪些字符。 现在从该输入文件中,我只想搜索包含除允许字符之外的字符的电子邮件地址。 我正在尝试为此编写一个 gawk,但无法使其正常工作。 这是我正在尝试的傻瓜:

gawk -F "," ' $2!~/[[:alnum:]@\.]]/ { print "has invalid chars" }' emails.csv

我面临的问题是上面的 gawk 命令只匹配没有字母数字的记录,@ 和 . (点)在他们。但我正在寻找的是具有允许字符但同时具有不允许字符的记录。

例如,上面的命令会找到

"_-()&(()%"

因为上面只有不是正则表达式的字符,但不会找到

“abc-123@xyz,com”

。因为它还具有正则表达式模式中指定字符类中存在的字符。

【问题讨论】:

标签: regex bash awk gawk


【解决方案1】:

几个测试一起怎么样:包含一个alnum和一个@以及一个点和一个无效字符

$2 ~ /[[:alnum:]]/ && $2 ~ /@/ && $2 ~ /\./ && $2 ~ /[^[:alnum:]@.]/

【讨论】:

  • code $2 ~ /[[:alnum:]@\.]/ && $2 ~ /[^[:alnum:]@\.]/ code
  • 问题在于它会匹配像@+ 这样的行,因为您正在寻找一个 alnum 或@ 或点。我的建议强制执行所有这三个
  • 匹配所有这 3 个不会让您更接近验证电子邮件地址,但例如 .7@ 将通过测试,因此 YMMV 可以通过测试所有 3 个与 @987654326 @。 $2 ~ /[[:alnum:]].*@.*\./ 会更好,但仍然留下很多漏洞。
  • @iamharish15 如前所述 elsethread 您不需要在括号表达式中转义 . 并测试正则表达式,然后对该正则表达式的否定只是另一种形式的代码重复,这总是一种不好的方法.
【解决方案2】:

你的正则表达式在这里是错误的:

/[[:alnum:]@\.]]/

应该是:

/[[:alnum:]@.]/

不删除额外的] 前端。

测试用例:

# regex with extra ]
awk -F "," '{print ($2 !~ /[[:alnum:]@.]]/)}' <<< 'abc,ab@email.com'
1

# correct regex
awk -F "," '{print ($2 !~ /[[:alnum:]@.]/)}' <<< 'abc,ab@email.com'
0

【讨论】:

  • 不,实际上,那个额外的括号是错误的。但是对于您的测试用例,即使使用正确的电子邮件地址,它也会匹配模式。
  • 不,这是不正确的。 awk -F "," ' $2 !~ /[[:alnum:]@.]/ { print "has invalid chars" }' &lt;&lt;&lt; 'abc,ab@email.com' 将输出该消息。但是第一个带有额外的] 将不起作用。
  • 另请参阅我的更新答案,其中包含额外的]
【解决方案3】:

您真的关心字符串是否包含有效字符吗?如果没有(而且您似乎没有),简单的解决方案是

$2 ~ /[^[:alnum:]@.]/{ print "has invalid chars" }

这不会在空字符串上触发,因此您可能需要为这种情况添加测试。

【讨论】:

    【解决方案4】:

    您的问题将真正受益于一些简洁、可测试的样本输入和预期输出,因为现在我们都在猜测您想要什么,但也许这样做呢?

    awk -F, '{r=$2} gsub(/[[:alnum:]@.]/,"",r) && (r!="") { print "has invalid chars" }' emails.csv
    

    例如使用您提供的 2 个输入示例:

    $ cat file
    _-()&(()%
    abc-123@xyz,com
    
    $ awk '{r=$0} gsub(/[[:alnum:]@.]/,"",r) && (r!="") { print $0, "has invalid chars" }' file
    abc-123@xyz,com has invalid chars
    

    顺便说一句,还有更准确的电子邮件正则表达式,例如:

    \<[[:alnum:]._%+-]+@[[:alnum:]_.-]+\.[[:alpha:]]{2,}\>
    

    在更新为使用 POSIX 字符类之后,这是对 http://www.regular-expressions.info/email.html 中描述的修改的一种特定于 gawk 的(用于单词分隔符 \&lt;\&gt;)。

    如果您尝试验证电子邮件地址,请不要使用您开始使用的正则表达式,因为它将声明 @7 都是有效的电子邮件地址。

    另请参阅How to validate an email address using a regular expression? 了解更多电子邮件正则表达式详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 2011-03-13
      相关资源
      最近更新 更多