加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:48:48 所属栏目:百科 来源:网络整理
导读:如何使用正则表达式匹配字符串中的第n个匹配项 set test {stackoverflowa is a best solution finding site stackoverflowb is a best solution finding site stackoverflowc is a best solution finding sitestackoverflowd is a best solution finding sit
如何使用正则表达式匹配字符串中的第n个匹配项

set test {stackoverflowa is a best solution finding site
stackoverflowb is a best solution finding site stackoverflowc is a
best solution finding sitestackoverflowd is a best solution finding
sitestackoverflowe is a best solution finding site}

regexp -all {stackoverflow} $test

上面的一个给出“5”作为输出

regexp {stackoverflow} $test

上面给出了stackoverflow作为结果,这里匹配stackoverflow的第一次出现(即stackoverflowa)

我的要求是我希望匹配第5次stackoverflow(即)stackoverflowe从上面给定的字符串.

请一些人澄清我的问题.谢谢

然后另一个问题

解决方法

尝试

set results [regexp -inline -all {stackoverflow.} $test]
# => stackoverflowa stackoverflowb stackoverflowc stackoverflowd stackoverflowe
puts [lindex $results 4]

我马上回来解释这个,现在做煎饼.

所以.

该命令返回test中包含的字符串的所有(-all)子串的列表(-inline),该字符串匹配字符串“stackoverflow”(少引号)加上一个字符,可以是任何字符.此列表存储在变量结果中,并通过索引4(因为索引从零开始),可以检索此列表的第五个元素(在这种情况下,打印).

表达式末尾的点不在你的表达式中:我添加它来检查我是否确实得到了正确的匹配.您当然可以省略点以完全匹配“stackoverflow”.

ETA(来自Donal的评论):在很多情况下,提取字符串本身不是很方便,而是在搜索字符串中提取它的位置和范围. -indices选项为您提供了(我现在不在表达式中使用点:索引列表显示了我正在获取的“stackoverflow”中的哪一个):

set indices [regexp -inline -all -indices {stackoverflow} $test]
# => {0 12} {47 59} {94 106} {140 152} {186 198}

然后,您可以使用字符串范围来获取字符串匹配:

puts [string range $test {*}[lindex $indices 4]]

lindex $indices 4给我列表186 198; {*}前缀使得该列表中的两个元素在字符串范围的调用中显示为两个单独的参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读