0

我多年来一直在使用正则表达式,我已经阅读了一些教程和参考资料(emacs 正则表达式参考是我的圣经),但我仍然无法理解匹配。有没有一个很好的关于正则表达式匹配的综合教程和丰富的例子?任何人都可以给我一个链接,我最终可以深入了解正则表达式匹配吗?

例如困扰我的问题。

haystack = "[{one, {one, andahalf}},\n {{two, zero}, two},\n {{threezero}, three},\n {four}]"
pattern = "({.+})"

结果是:

{one, {one, andahalf}}
{{two, zero}, two}
{{threezero}, three}
{four}

现在,那到底是什么?贪婪还是非贪婪(它是 C# Regexp.Matches)?

为什么,为什么(非贪婪)结果不是:

{one, {one, andahalf}
{{two, zero}
{{threezero}
{four}

(匹配第一对可能的 {})

或(贪婪):

{one, {one, andahalf}},\n {{two, zero}, two},\n {{threezero}, three},\n {four}

(加工最大可能的 {} 对)

当然,实际结果正是我所需要的,我很高兴正则表达式能读懂我的想法,但我宁愿我读懂他的想法:-D 那么,有没有人有任何关于正则表达式匹配的体面教程帮助我了解这场比赛是如何做到的?

4

2 回答 2

1

发生这种情况的原因是这些模式由换行符分隔,并且默认情况下,点(在.+您的正则表达式中)匹配除换行符之外的任何内容。要更改该行为,请使用RegexOptions.Singlelineset 编译正则表达式。

因此,在这场贪婪的比赛中,括号正确平衡只是一个巧合。

可以在http://www.regular-expressions.info找到一个很好的正则表达式教程。

顺便说一句,为了安全起见,大括号应该总是被转义(\{\})。.NET 正则表达式引擎碰巧认识到它们在这种情况下不能表示量词,但其他引擎将无法编译此正则表达式。

于 2011-08-06T11:01:29.097 回答
1

这是一个简单的...阅读:掌握正则表达式(第 3 版)

这是毫无疑问的,我一生中读过的最有用的书。非常清晰、准确和无差错地呈现材料。一个有趣且详尽的教程,可深入了解 NFA 正则表达式引擎的工作原理,以及如何利用这些知识开始制作准确高效的正则表达式(几乎适用于任何语言)。

说到正则表达式,有两种人:读过这本书的人和没读过这本书的人。

.*(你可以通过他们的表情中的所有点星来发现那些没有的人。)

于 2011-08-06T12:20:24.033 回答