gpt4 book ai didi

regex - 如何编写更易于维护的正则表达式?

转载 作者:行者123 更新时间:2023-12-02 04:46:10 24 4
gpt4 key购买 nike

我开始觉得使用正则表达式会降低代码的可维护性。正则表达式的简洁和强大有一些邪恶之处。 Perl 将此与默认运算符等副作用混合在一起。

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

因为正则表达式是建立起来的,所以我觉得绝对有必要对表达式中每个元素的最大组成部分进行注释。尽管如此,即使是我自己的正则表达式也让我摸不着头脑,就好像我在读克林贡语一样。

你是否故意简化你的正则表达式?您是否将可能更短、更强大的步骤分解为更简单的步骤?我已经放弃了嵌套正则表达式。是否存在因可维护性问题而避免使用的正则表达式结构?

不要让这个例子掩盖问题。

如果以下为 Michael Ash里面有某种错误,除了完全扔掉它之外,你还有其他办法吗?

^(?:(?:(?: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})$

根据请求,可以使用 Ash 先生上面的链接找到确切的目的。

匹配 01.1.02 | 2001 年 11 月 30 日 | 2/29/2000

不匹配 02/29/01 | 13/01/2002 | 2002 年 11 月 00 日

最佳答案

使用Expresso它给出了正则表达式的分层英文分解。

或者

这个tip来自达伦·内姆克:

.NET allows regular expression patterns to be authored with embedded comments via the RegExOptions.IgnorePatternWhitespace compiler option and the (?#...) syntax embedded within each line of the pattern string.

This allows for psuedo-code-like comments to be embedded in each line and has the following affect on readability:

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 选项):

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
";

如果您的正则表达式适用于常见问题,另一种选择是将其记录下来并提交至 RegExLib ,将在其中对其进行评级和评论。没有什么比很多双眼睛更胜一筹了......

另一个正则表达式工具是 The Regulator

关于regex - 如何编写更易于维护的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/708254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com