我多年来一直在使用正则表达式,我已经阅读了几个教程和参考资料(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}
(加工最大的{}}
当然,实际的结果正是我所需要的,而且我很高兴正则表达式能够理解我的想法,但我宁愿我读到他的想法:-那么,有没有人在正则表达式上有任何体面的教程匹配,这将有助于我理解这场比赛是如何做到的?
答案 0 :(得分:1)
这恰好起作用的原因是这些模式由换行符分隔,默认情况下,点(在正则表达式的.+
部分中)与换行符匹配。要更改该行为,请使用RegexOptions.Singleline
set。
因此,在这场贪婪的比赛中,大括号的正确平衡只是巧合。
可以在http://www.regular-expressions.info找到一个好的正则表达式教程。
顺便说一句,为了安全起见,应始终对大括号进行转义(\{
,\}
)。 .NET正则表达式引擎碰巧认识到它们在这个上下文中并不意味着量词,但是其他引擎将无法编译这个正则表达式。
答案 1 :(得分:1)
这很简单......阅读:Mastering Regular Expressions (3rd Edition)
这是我一生中读过的最有用的书。非常清晰,准确且无错误地呈现材料。一个有趣而全面的教程,可以深入了解NFA正则表达式引擎的工作原理,以及如何利用这些知识开始制作准确有效的正则表达式(适用于任何语言)
当谈到正则表达式时,有两种类型的人:读过这本书的人和那些没有读过这本书的人。
(你可以在他们的表达中找到那些没有.*
个点星的人。)