set string {rose is an flower jasmine is a flower rose is an flower rose is a colour jasmine is a flower}从上面的字符串中,我希望匹配rose is an flower和rose is a colour。
所以我像下面这样做了regexp,
% puts [regexp -all {rose.+?(flower|colour)} $string]
3从上面的o/p我们有三个匹配。
% puts [regexp -all -inline {rose.+?(flower|colour)} $string]
{rose is an flower} flower {rose is an flower} flower {rose is a colour} colour从上面的输出中,我期望:
{rose is an flower} {rose is an flower} {rose is a colur}我不知道下面突出显示的单词是如何出现的
{rose is an flower} flower {rose is an flower} flower {rose is a colour} colour
^^^^^^ ^^^^^^ ^^^^^^如果有人解释,我将不胜感激。
发布于 2014-07-08 19:32:07
括号中的子表达式()定义将为您单独提取的捕获组。从manuals
(正则表达式)一个或多个正则表达式周围的括号指定嵌套的正则表达式或多个正则表达式的选择。匹配嵌套正则表达式的子串被捕获,并且可以通过反向引用机制被引用,并且被捕获到指定为命令的参数的相应匹配变量中。
如果您不想提取捕获组,只需在括号的开头添加?:,在这种情况下,它们将只定义子表达式:
%puts [regexp -all -inline {rose.+?(?:flower|colour)} $string]
{rose is an flower} {rose is an flower} {rose is a colour}发布于 2014-07-08 20:06:11
在Tcl中使用惰性量词时要注意
Tcl惰性量词在后面跟着一个交替时是不可靠的,因为它们想要返回最长的匹配(因此它们可能会比您预期的跳得更远)。改用这个正则表达式:
rose(?:(?!flower|colour).)*(?:flower|colour)参见this demo。
https://stackoverflow.com/questions/24630459
复制相似问题