首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用正则表达式匹配字符串中的第n次出现项

如何使用正则表达式匹配字符串中的第n次出现项
EN

Stack Overflow用户
提问于 2014-07-08 19:19:41
回答 2查看 129关注 0票数 0
代码语言:javascript
复制
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

所以我像下面这样做了regexp,

代码语言:javascript
复制
% puts [regexp -all {rose.+?(flower|colour)} $string]
3

从上面的o/p我们有三个匹配。

代码语言:javascript
复制
% puts [regexp -all -inline {rose.+?(flower|colour)} $string]
{rose is an flower} flower {rose is an flower} flower {rose is a colour} colour

从上面的输出中,我期望:

代码语言:javascript
复制
{rose is an flower} {rose is an flower} {rose is a colur}

我不知道下面突出显示的单词是如何出现的

代码语言:javascript
复制
{rose is an flower} flower {rose is an flower} flower {rose is a colour} colour
                    ^^^^^^                     ^^^^^^                    ^^^^^^

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

EN

回答 2

Stack Overflow用户

发布于 2014-07-08 19:32:07

括号中的子表达式()定义将为您单独提取的捕获组。从manuals

(正则表达式)一个或多个正则表达式周围的括号指定嵌套的正则表达式或多个正则表达式的选择。匹配嵌套正则表达式的子串被捕获,并且可以通过反向引用机制被引用,并且被捕获到指定为命令的参数的相应匹配变量中。

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

代码语言:javascript
复制
%puts [regexp -all -inline {rose.+?(?:flower|colour)} $string]
{rose is an flower} {rose is an flower} {rose is a colour}
票数 4
EN

Stack Overflow用户

发布于 2014-07-08 20:06:11

在Tcl中使用惰性量词时要注意

Tcl惰性量词在后面跟着一个交替时是不可靠的,因为它们想要返回最长的匹配(因此它们可能会比您预期的跳得更远)。改用这个正则表达式:

代码语言:javascript
复制
rose(?:(?!flower|colour).)*(?:flower|colour)

参见this demo

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24630459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档