【问题标题】:Having issue with back reference in TCLTCL 中的反向引用有问题
【发布时间】: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 本身就足够了,对吧?为什么还要麻烦反向引用?

标签: regex tcl regexp-replace regexp-substr


【解决方案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,而是使用真正的换行符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多