我开始觉得使用正则表达式会降低代码的可维护性。正则表达式的简洁性和威力有一些邪恶之处。Perl使用默认操作符之类的副作用来加重这一问题。
我确实有记录正则表达式的习惯,至少有一个句子给出了基本意图,并且至少有一个匹配的例子。
因为正则表达式是构建的,所以我认为绝对有必要对表达式中每个元素的最大组件进行注释。尽管如此,即使是我自己的正则表达式也让我挠头,就好像我在读克林贡一样。
你是故意把你的正则表达式哑了吗?你会把可能更短、更强大的步骤分解成更简单的步骤吗?我已经放弃了嵌套正则表达式。由于可维护性问题,是否存在避免的正则表达式构造?
不让这个例子给问题蒙上阴影.
如果迈克尔·阿什下面的代码中有某种bug,那么除了完全丢弃它之外,您还有什么可以做的吗?
^(?:(?:(?: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
发布于 2009-04-02 04:16:46
我通常只是尝试将所有正则表达式调用包装在它们自己的函数中,其中包含有意义的名称和一些基本的注释。我喜欢把正则表达式看作是一种只写的语言,只有编写正则表达式的语言才能阅读(除非它真的很简单)。我完全希望有人可能需要完全重写表达式,如果他们必须改变它的意图,这可能是为了更好地保持正则表达式的训练活着。
发布于 2009-04-02 04:18:03
使用特普索,它给出了一个等级的,英文的正则表达式的细分。
或
来自达伦·尼姆克的提示:
.NET允许通过RegExOptions.IgnorePatternWhitespace编译器选项和(?#.)使用嵌入式注释编写正则表达式模式。语法嵌入到模式字符串的每一行中。 这允许在每一行中嵌入类似psuedo代码的注释,并对可读性产生以下影响:
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.Multiline和RegexOptions.IgnorePatternWhitespace选项):
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工具是调整器
发布于 2009-04-02 04:19:58
嗯,PCRE /x修饰符的全部用途是允许您更容易地编写正则表达式,就像下面这个简单的示例所示:
my $expr = qr/
[a-z] # match a lower-case letter
\d{3,5} # followed by 3-5 digits
/x;https://stackoverflow.com/questions/708254
复制相似问题