使用Henry Spencer正则表达式库时(。+ _)*是什么意思?

时间:2012-12-18 10:25:35

标签: regex

参考亨利斯宾塞正则表达式库,我想知道(.+_)*(.)*之间的区别。

(.+_)*尝试匹配后面的字符串。根据我的理解.匹配任何单个字符,.+将表示该字符的非零次出现。 _表示空格或{或}或等等

括号表示可以考虑任何一个匹配,最后*表示出现0次或更多次。

我觉得(.)*也会达到同样的目的。 +之后的.可能是多余的。

有人可以解释一下这两者之间的细微差别吗?

3 个答案:

答案 0 :(得分:2)

例如,aa aa将由(.+_)*匹配,但不会由(._)*匹配,因为后者只需要空格前的一个字符。

答案 1 :(得分:2)

我不记得下划线有任何特殊含义。 Henry Spencer正则表达式库的特殊之处在于它结合了正则表达式引擎技术 - 确定性和非确定性。

这有一个赞成和一个骗局。

专业人士认为你的regexps将是最快的,简单的构建,而在其他引擎中你可能会使用看起来像头和高级正则表达式技术(如果没有匹配就让它早期失败)来达到相同的速度

con是整个正则表达式都是贪婪的或非贪婪的。也就是说,如果您使用*或+而不使用a?,那么整个正则表达式将是贪婪的,即使您使用?之后。如果你第一次使用*或+,你用一个?,那么整个正则表达式将是非贪婪的。

这使得制作正则表达式的方法有点稍微,但实际上很轻微。

Henry Speced库是 tcl regexp命令背后的引擎,这使得该语言对正则表达式非常有效。

答案 2 :(得分:1)

据我所知_没有特殊含义,它只是一个“_”。见regular-expressions.info

你的两个正则表达不一样。

  1. (._)*将匹配一个字符后跟一个下划线(如果下划线在您的实现中具有特殊含义,则用该含义替换“下划线”),此序列将匹配0次或更多次,例如“a_%_._?_

  2. (.+_)*将匹配至少一个字符,后跟下划线,此序列将匹配0次或更多次,例如“abc45_%_.;,:_?#'+*~_

  3. (.+_)*将匹配(._)*可以匹配的所有内容,但不会反过来。