如何使用正则表达式匹配字符串中的第n个匹配项

时间:2014-07-08 11:19:41

标签: regex tcl

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 flowerrose is a colour

所以我做了如下的正则表达式,

% 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
                    ^^^^^^                     ^^^^^^                    ^^^^^^

如果有人解释,我将不胜感激。

2 个答案:

答案 0 :(得分:4)

括号()包围的Subexpressions定义了将为您单独提取的捕获组。来自manuals

  

(正则表达式)`       围绕一个或多个正则表达式的括号指定嵌套正则表达式或选择多个正则表达式。   捕获匹配嵌套正则表达式的子字符串   可以通过后引用机制引用,并且也可以捕获   进入相应的匹配变量指定为arbument   命令。

如果您不想提取捕获组,只需在括号的开头添加?:,在这种情况下,他们只需定义一个子表达式:

%puts [regexp -all -inline {rose.+?(?:flower|colour)} $string]
{rose is an flower} {rose is an flower} {rose is a colour}

答案 1 :(得分:1)

注意Tcl中的Lazy Quantifiers

Tcl延迟量词在跟随交替时是不可靠的,因为他们想要返回最长的匹配(因此它们可能比你预期的跳得更远)。请改用此正则表达式:

rose(?:(?!flower|colour).)*(?:flower|colour)

请参阅this demo