gpt4 book ai didi

regex - 使一个小的正则表达式更具可读性

转载 作者:行者123 更新时间:2023-12-01 11:07:30 24 4
gpt4 key购买 nike

我有一个可用的正则表达式,但我想让它更具可读性,而且我远不是正则表达式专家,所以我谦虚地希望得到一些提示。

这是为了抓取几个不同的编译器、链接器和其他构建工具的输出而设计的,并用于构建一个不错的小总结报告。它做得很好,但我觉得自己写的方式很笨拙,我宁愿早点学习也不愿以错误的方式使用它。

(.*?)\s?:?\s?(informational|warning|error|fatal error)?\s([A-Z]+[0-9][0-9][0-9][0-9]):\s(.*)$

其中,简单分解如下:

(.*?)                                       # non-greedily match up until...
\s?:?\s? # we come across a possible " : "
(informational|warning|error|fatal error)? # possibly followed by one of these
\s([A-Z]+[0-9][0-9][0-9][0-9]):\s # but 100% followed by this alphanum
(.*)$ # and then capture the rest

我最感兴趣的是让上面的第二个和第四个条目更……漂亮。出于某种原因,我使用的正则表达式测试器 (The Regulator) 不匹配纯空格,所以我不得不使用\s... 但它并不意味着匹配任何其他空格。

任何学校教育都将不胜感激。

最佳答案

使长正则表达式更具可读性的最简单方法是使用“free-spacing”(或\x)modifier ,这将使您可以像在第二个代码块中那样编写正则表达式——它会忽略空格。然而,并非所有引擎都支持它(根据上面链接的页面,.NET、Java、Perl、PCRE、Python、Ruby 和 XPath 支持它)。

另请注意,在自由间距模式下,如果您只想匹配一个空格字符(除非您正在使用Java,在这种情况下,您必须使用 \,这是一个转义空格)。

如果您希望每个元素都是可选的,独立于其他元素,您实际上无法为第二行做任何事情,但可以缩短第四行:

\s([A-Z]+\d{4}):\s

\dshorthand class相当于[0-9]{4}指定它应该出现exactly four times .

第三行也可以稍微缩短((?:…) 指定一个非捕获 group ):

(informational|warning|(?:fatal )? error)?

从效率的角度来看,除非您每次使用括号时实际上都需要捕获子模式,否则您可以删除所有子模式,除了第三行,alternation 需要该组。 ) -- 但是可以将其设为非捕获。把这些放在一起你会得到:

.*?
\s?:?\s?
(?:informational|warning|(?:fatal )?error)?
\s[A-Z]+\d{4}:\s
.*$

关于regex - 使一个小的正则表达式更具可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3833787/

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