最近,我在正则表达式中看到了“零宽度元素”。这些是什么?它们是否可以被视为鬼数据,因此替换它们时不会被替换,而( )
匹配时,它们不会进入matches[1]
,matches[2]
等?
是否有适合各种用途的好教程?他们在这儿待了很久吗?哪个版本的O'Reilly的正则表达书是第一个讨论它们的?
答案 0 :(得分:5)
零宽度外观断言的一点是,它们检查某个正则表达式是否能够或者不能从当前位置向前或向后匹配,而不实际将它们添加到匹配中。所以,是的,它们不会计入捕获组,是的,它们的匹配将不会被替换(因为它们首先不匹配)。
但是,你可以在一个环绕声断言中有一个捕获组,将进入matches[1]
等。
例如,在C#中:
Regex.Replace("ab", "(a)(?=(b))", "$1$2");
将返回abb
。
关于正则表达式的一个非常好的在线教程可以在http://www.regular-expressions.info找到(即使它在某些方面有点过时)。
它包含有关zero-width lookaround assertions(和Part II)的具体部分。
当然,Mastering Regular Expressions和Regular Expressions Cookbook都会深入介绍它们。