参考亨利斯宾塞正则表达式库,我想知道(.+_)*
和(.)*
之间的区别。
(.+_)*
尝试匹配后面的字符串。根据我的理解.
匹配任何单个字符,.+
将表示该字符的非零次出现。 _
表示空格或{或}或等等
括号表示可以考虑任何一个匹配,最后*
表示出现0次或更多次。
我觉得(.)*
也会达到同样的目的。 +
之后的.
可能是多余的。
有人可以解释一下这两者之间的细微差别吗?
答案 0 :(得分:2)
例如,aa aa
将由(.+_)*
匹配,但不会由(._)*
匹配,因为后者只需要空格前的一个字符。
答案 1 :(得分:2)
我不记得下划线有任何特殊含义。 Henry Spencer正则表达式库的特殊之处在于它结合了正则表达式引擎技术 - 确定性和非确定性。
这有一个赞成和一个骗局。
专业人士认为你的regexps将是最快的,简单的构建,而在其他引擎中你可能会使用看起来像头和高级正则表达式技术(如果没有匹配就让它早期失败)来达到相同的速度
con是整个正则表达式都是贪婪的或非贪婪的。也就是说,如果您使用*或+而不使用a?,那么整个正则表达式将是贪婪的,即使您使用?之后。如果你第一次使用*或+,你用一个?,那么整个正则表达式将是非贪婪的。
这使得制作正则表达式的方法有点稍微,但实际上很轻微。
Henry Speced库是 tcl 的regexp
命令背后的引擎,这使得该语言对正则表达式非常有效。
答案 2 :(得分:1)
据我所知_
没有特殊含义,它只是一个“_”。见regular-expressions.info
你的两个正则表达不一样。
(._)*
将匹配一个字符后跟一个下划线(如果下划线在您的实现中具有特殊含义,则用该含义替换“下划线”),此序列将匹配0次或更多次,例如“a_%_._?_
”
(.+_)*
将匹配至少一个字符,后跟下划线,此序列将匹配0次或更多次,例如“abc45_%_.;,:_?#'+*~_
”
(.+_)*
将匹配(._)*
可以匹配的所有内容,但不会反过来。