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 - 数据库中的多对多引用,模型中没有反向引用

回溯中的反向引用

Python re 中的命名反向引用 (?P=name) 问题

TCL:使用添加库文件

正则表达式反向引用乘法[重复]