(.+_)*
参考 Henry spencer 正则表达式库,我想知道和之间的区别(.)*
。
(.+_)*
也尝试从后面匹配字符串。据我了解.
,匹配任何单个字符,.+
将意味着该字符的非零出现。_
将表示空格或 { 或 } 或 等。
括号意味着任何一个都可以被认为是匹配的,最后*
表示 0 次或多次出现。
我觉得(.)*
也会达到同样的效果。+
后面.
可能是多余的。
有人可以解释一下两者之间的细微差别吗?
(.+_)*
参考 Henry spencer 正则表达式库,我想知道和之间的区别(.)*
。
(.+_)*
也尝试从后面匹配字符串。据我了解.
,匹配任何单个字符,.+
将意味着该字符的非零出现。_
将表示空格或 { 或 } 或 等。
括号意味着任何一个都可以被认为是匹配的,最后*
表示 0 次或多次出现。
我觉得(.)*
也会达到同样的效果。+
后面.
可能是多余的。
有人可以解释一下两者之间的细微差别吗?
例如,aa aa
将被匹配(.+_)*
但不被匹配,(._)*
因为后者只需要空格前的一个字符。
我不记得下划线有什么特殊含义。Henry Spencer 正则表达式库的特别之处在于它结合了正则表达式引擎技术——确定性和非确定性。
这有利有弊。
优点是您的正则表达式将是最快的,并且构建简单,而在其他引擎中,您可能会使用外观和高级正则表达式技术(例如,如果没有匹配项,则使其提前失败)以达到相同的速度。
缺点是整个正则表达式要么是贪婪的,要么是非贪婪的。也就是说,如果您使用 * 或 + 后没有 ?,那么整个正则表达式将是贪婪的,即使您使用 ? 在那之后。如果您第一次使用 * 或 + 后跟一个 ?,那么整个正则表达式将是非贪婪的。
这使得制作正则表达式有点棘手,但确实有点棘手。
Henry Speced 库是tcl命令背后的引擎,regexp
这使得这种语言对于正则表达式非常有效。
据我所知,_
它没有特殊含义,它只是一个“_”。请参阅正则表达式.info
你的两个正则表达式不一样。
(._)*
将匹配一个字符后跟一个下划线(如果下划线在您的实现中具有特殊含义,则将“下划线”替换为该含义),该序列将匹配 0 次或更多次,例如“ a_%_._?_
”
(.+_)*
将匹配至少一个字符后跟一个下划线,此序列将匹配 0 次或多次,例如“ abc45_%_.;,:_?#'+*~_
”
(.+_)*
将匹配可以匹配的所有内容,(._)*
但反之则不然。