TCL 中的反向引用有问题
Posted
技术标签:
【中文标题】TCL 中的反向引用有问题【英文标题】:Having issue with back reference in TCL 【发布时间】:2015-07-30 23:54:12 【问题描述】:我有以下代码:
set a "10.20.30.40"
regsub -all .([0-9]+).([0-9]+). $a \2 \1 b
我正在尝试 grep IP 地址的第 2 和第 3 个八位字节。
预期输出:
20 30
实际输出:
20 04 0
我的错误是什么?
【问题讨论】:
你需要转义“.”像“\”这样的字符.没有转义,“。”匹配任何字符。 尝试了同样的方法,但没有运气 regsub -all \.([0-9]+)\.([0-9]+)\. $a \2 \1 b @Bharathi:对不起。我不清楚你的意图。是否需要匹配变量a
中的20.30.
并替换为其他一些?
知道了。您需要将“.20.30”替换为“30.20”。对吧?
@Bharathi :如果您只是想保存第 2 和第 3 个八位字节,那么为什么要 regsub
呢? regexp
本身就足够了,对吧?为什么还要麻烦反向引用?
【参考方案1】:
我会完全远离正则表达式:
set b [join [lrange [split $a .] 1 2]]
将值拆分为点,取第二个和第三个元素,并用空格连接它们。
【讨论】:
【参考方案2】:您需要为匹配组和捕获组设置变量,然后才能访问它们。这是一个例子:
set a "10.20.30.40"
set rest [regexp [0-9]+\.([0-9]+)\.([0-9]+)\.[0-9]+ $a match submatch1 submatch2]
puts $submatch1
puts $submatch2
the demo的输出
20
30
编辑:
您可以通过这种方式使用 regsub 和 backerferences(我现在替换第 3 和第 2 个八位字节,只是为了演示)。请注意,必须对文字点进行转义:
set a "10.20.30.40"
regsub -all \.([0-9]+)\.([0-9]+)\. $a .\2.\1. b
puts $b
demo 的输出:
10.30.20.40
要获取“20 30”字符串,需要使用
regsub -all ^[0-9]+\.([0-9]+)\.([0-9]+)\.[0-9]+$ $a \1 \2 b
【讨论】:
感谢您的努力,但我想使用 regsub 和反向引用来 grep 这些八位字节。 ...正如我的问题中提到的,regesub 命令可用。但它不工作 谢谢 :) .... 它工作正常.. 请让我知道任何文档以了解反向引用 当然,最好的 IMO 是 Regular-expressions.info。 我还有一个问题,请您帮帮我。设置一个“1 abc 2 abc 3 abc 4 abc 5 abc 6 abc 7 abcd”。我想将前 3 个“abc”替换为 bhu usinf regsub 并返回参考...请帮助我.. 你在这里:set a "1 abc 2 abc 3 abc 4 abc 5 abc 6 abc 7 abcd" \\NEWLINE regsub ([0-9]+\s+)abc( +[0-9]+ +)abc( +[0-9]+ +)abc(.*) $a \1bhu\2bhu\3bhu\4 b \\NEWLINE puts $b
。不要使用\\NEWLINE
,而是使用真正的换行符。以上是关于TCL 中的反向引用有问题的主要内容,如果未能解决你的问题,请参考以下文章
TCL - 对 g++ 的 `_imp__Tcl_ResetResult' 的未定义引用
EntityFramework - 数据库中的多对多引用,模型中没有反向引用