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; {*}前缀使得该列表中的两个元素在字符串范围的调用中显示为两个单独的参数.