【问题标题】:VIM regex capture group catches nothingVIM 正则表达式捕获组什么也没捕获
【发布时间】:2018-11-25 19:23:43
【问题描述】:

我正在使用 vim 解析一些文件,并想更改以下代码的格式。

原始格式:

vmm_note(log, "TEST_DIR - BEGIN");

所需格式:

uvm_info("Test_seq", "TEST_DIR - BEGIN",UVM_LOW);

当此代码只有一行时,以下正则表达式正在运行。

%s/vmm_note(log,\(.*\));/uvm_info("Test_seq",\1,UVM_LOW);/gc

但是,当代码由多行组成时,我的正则表达式可以匹配模式,但在替换中,\1 组不包含任何内容。

原始格式:

vmm_note(log, $psprintf("INFO: setting debug port to watch %0s",
                    (req_info.debug_which==4'd0) ? "MC" :
                     "LZHI"));

正则表达式:

%s/vmm_note(log,\(\_.\)\{-};/uvm_info("Test_seq",\1,UVM_LOW);/g

结果:

uvm_info("Test_seq",),UVM_LOW);

我想知道为什么捕获组中不包含任何内容?

提前感谢您的帮助!

【问题讨论】:

  • 第二种“原始格式”的期望输出是什么?
  • uvm_info("Test_seq", $psprintf("INFO: setting debug port to watch %0s", (req_info.debug_which==4'd0) ? "MC" : "LZHI"),UVM_LOW );

标签: regex vim capture-group


【解决方案1】:

您很接近,而不是 \(\_.\)\{-}; 使用 \(\_.\{-}\); 在捕获组中包含所需的文本。所以多行替换变成:

%s/vmm_note(log,\(\_.\{-}\);/umv_info("Test_seq",\1,UVM_LOW);/g

示例输入:

vmm_note(log, $psprintf("INFO: setting debug port to watch %0s",            
                       (req_info.debug_which==4'd0) ? "MC" :                   
                        "LZHI"));

输出:

umv_info("Test_seq", $psprintf("INFO: setting debug port to watch %0s",     
                    (req_info.debug_which==4'd0) ? "MC" :                   
                     "LZHI"),UVM_LOW);                                      

【讨论】:

    【解决方案2】:

    试试

    %s/vmm_note(log,\(\_[^;]*\));/uvm_info("Test_seq",\1,UVM_LOW);/gc
    

    希望这会有所帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2013-11-23
      • 2018-03-11
      • 1970-01-01
      相关资源
      最近更新 更多