2

(.+_)*参考 Henry spencer 正则表达式库,我想知道和之间的区别(.)*

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

括号意味着任何一个都可以被认为是匹配的,最后*表示 0 次或多次出现。

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

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

4

3 回答 3

2

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

于 2012-12-18T10:32:05.300 回答
2

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

这有利有弊。

优点是您的正则表达式将是最快的,并且构建简单,而在其他引擎中,您可能会使用外观和高级正则表达式技术(例如,如果没有匹配项,则使其提前失败)以达到相同的速度。

缺点是整个正则表达式要么是贪婪的,要么是非贪婪的。也就是说,如果您使用 * 或 + 后没有 ?,那么整个正则表达式将是贪婪的,即使您使用 ? 在那之后。如果您第一次使用 * 或 + 后跟一个 ?,那么整个正则表达式将是非贪婪的。

这使得制作正则表达式有点棘手,但确实有点棘手。

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

于 2012-12-18T10:32:56.877 回答
1

据我所知,_它没有特殊含义,它只是一个“_”。请参阅正则表达式.info

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

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

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

(.+_)*将匹配可以匹配的所有内容,(._)*但反之则不然。

于 2012-12-18T11:13:15.363 回答