如何使用正则表达式匹配字符串中的第n个出现
设置测试{stackoverflowa是发现站点的最佳解决方案stackoverflowb是发现站点的最佳解决方案stackoverflowc是发现站点的最佳解决方案stackstackoverflowd是发现最佳的解决方案sitestackoverflowe是发现最佳的解决方案的站点}
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]
我将稍后再作进一步解释,现在做煎饼。
所以。
该命令返回包含在字符串中的-inline
所有(-all
)子字符串的列表(),该子字符串test
与字符串“ stackoverflow”(较少的引号)相匹配,再加上一个字符(可以是任何字符)。该列表存储在变量中result
,并且通过用4进行索引(因为索引是从零开始的),可以检索(并在这种情况下打印)该列表的第五个元素。
表达式末尾的点不在您的表达式中:我添加了它以检查是否确实找到了正确的匹配项。您当然可以省略该点以完全匹配“ stackoverflow”。
ETA(来自Donal的评论):在许多情况下,提取字符串本身而不是提取字符串在搜索字符串中的位置和范围很方便。该-indices
选项为您提供了这一点(我现在不在表达式中使用点:索引列表使我无论如何都会获得“ stackoverflow”之一):
set indices [regexp -inline -all -indices {stackoverflow} $test]
# => {0 12} {47 59} {94 106} {140 152} {186 198}
然后,您可以string range
用来获取字符串匹配项:
puts [string range $test {*}[lindex $indices 4]]
该lindex $indices 4
给我的名单186 198
; 该{*}
前缀使得在该列表中的两个元素出现在的调用两个独立的参数string range
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句