首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写更可维护的正则表达式?

如何编写更可维护的正则表达式?
EN

Stack Overflow用户
提问于 2009-04-02 04:05:51
回答 12查看 3.6K关注 0票数 42

我开始觉得使用正则表达式会降低代码的可维护性。正则表达式的简洁性和威力有一些邪恶之处。Perl使用默认操作符之类的副作用来加重这一问题。

我确实有记录正则表达式的习惯,至少有一个句子给出了基本意图,并且至少有一个匹配的例子。

因为正则表达式是构建的,所以我认为绝对有必要对表达式中每个元素的最大组件进行注释。尽管如此,即使是我自己的正则表达式也让我挠头,就好像我在读克林贡一样。

你是故意把你的正则表达式哑了吗?你会把可能更短、更强大的步骤分解成更简单的步骤吗?我已经放弃了嵌套正则表达式。由于可维护性问题,是否存在避免的正则表达式构造?

不让这个例子给问题蒙上阴影.

如果迈克尔·阿什下面的代码中有某种bug,那么除了完全丢弃它之外,您还有什么可以做的吗?

代码语言:javascript
复制
^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

根据请求,可以使用上面的链接找到确切的用途。

匹配 01.1.02 \x{e 010} 11-30-2001 2/29/2000

非比赛 02/29/01 \ 13/01/2002 / 11/00/02

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-04-02 04:16:46

我通常只是尝试将所有正则表达式调用包装在它们自己的函数中,其中包含有意义的名称和一些基本的注释。我喜欢把正则表达式看作是一种只写的语言,只有编写正则表达式的语言才能阅读(除非它真的很简单)。我完全希望有人可能需要完全重写表达式,如果他们必须改变它的意图,这可能是为了更好地保持正则表达式的训练活着。

票数 19
EN

Stack Overflow用户

发布于 2009-04-02 04:18:03

使用特普索,它给出了一个等级的,英文的正则表达式的细分。

来自达伦·尼姆克的提示

.NET允许通过RegExOptions.IgnorePatternWhitespace编译器选项和(?#.)使用嵌入式注释编写正则表达式模式。语法嵌入到模式字符串的每一行中。 这允许在每一行中嵌入类似psuedo代码的注释,并对可读性产生以下影响:

代码语言:javascript
复制
Dim re As New Regex ( _
    "(?<=       (?# Start a positive lookBEHIND assertion ) " & _
    "(#|@)      (?# Find a # or a @ symbol ) " & _
    ")          (?# End the lookBEHIND assertion ) " & _
    "(?=        (?# Start a positive lookAHEAD assertion ) " & _
    "   \w+     (?# Find at least one word character ) " & _
    ")          (?# End the lookAHEAD assertion ) " & _
    "\w+\b      (?# Match multiple word characters leading up to a word boundary)", _
    RegexOptions.Multiline Or RegexOptions.IgnoreCase Or RegexOptions.IgnoreWhitespace _
)

下面是另一个.NET示例(需要RegexOptions.MultilineRegexOptions.IgnorePatternWhitespace选项):

代码语言:javascript
复制
static string validEmail = @"\b    # Find a word boundary
                (?<Username>       # Begin group: Username
                [a-zA-Z0-9._%+-]+  #   Characters allowed in username, 1 or more
                )                  # End group: Username
                @                  # The e-mail '@' character
                (?<Domainname>     # Begin group: Domain name
                [a-zA-Z0-9.-]+     #   Domain name(s), we include a dot so that
                                   #   mail.somewhere is also possible
                .[a-zA-Z]{2,4}     #   The top level domain can only be 4 characters
                                   #   So .info works, .telephone doesn't.
                )                  # End group: Domain name
                \b                 # Ending on a word boundary
                ";

如果您的RegEx适用于一个常见的问题,另一种选择是将其文档化并提交到RegExLib,在那里将对其进行评级和注释。什么也比不上许多双眼睛..。

另一个RegEx工具是调整器

票数 32
EN

Stack Overflow用户

发布于 2009-04-02 04:19:58

嗯,PCRE /x修饰符的全部用途是允许您更容易地编写正则表达式,就像下面这个简单的示例所示:

代码语言:javascript
复制
my $expr = qr/
    [a-z]    # match a lower-case letter
    \d{3,5}  # followed by 3-5 digits
/x;
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/708254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档