【问题标题】:Complex(?) regex: Is expression, but not another复杂(?)正则表达式:是表达式,但不是另一个
【发布时间】:2010-06-13 09:22:42
【问题描述】:

(如果你能做一个更好的标题,请做)

嗨,

我需要确保字符串与以下正则表达式匹配:

^[0-9a-zA-Z]{1}[0-9a-zA-Z\.\-_]*$
(Starts with a letter or number, then any number of letters, numbers, dots, dashes or underscores)

但鉴于此,我需要确保它不匹配 Guid,我的 Guid 匹配 reg-ex 看起来像这样(显然,这需要在合并结果中取反):

^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$

这里的最后一个要求是它们必须(如果可能的话)合并到一个表达式中。

【问题讨论】:

    标签: regex regex-negation lookahead negative-lookahead


    【解决方案1】:

    您可以只使用negative lookahead assertion

    (?!YourGuidExpression)YourOtherExpression
    

    【讨论】:

      【解决方案2】:

      如果您的语言支持,最简单的方法是使用negative lookahead

      ^(?!([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$)[0-9a-zA-Z]{1}[0-9a-zA-Z\.\-_]*$
      

      【讨论】:

        【解决方案3】:

        我建议同时使用这两个正则表达式,而不是组合它们。在大多数情况下,这将更容易维护并且速度更快。像这样的:

        if (m/^[0-9a-zA-Z]{1}[0-9a-zA-Z\.\-_]*$/) {
          my $m = $&;
          if ($m =~ m/^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$/) {
            return null;
          } else {
            return $m;
          } 
        } else {
          return null;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-09-14
          • 2012-04-10
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          • 2018-02-01
          • 1970-01-01
          • 2015-02-21
          • 1970-01-01
          相关资源
          最近更新 更多