Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex gVim使用正则表达式在每个匹配模式之前插入序列号_Regex_Vim_Number Sequence - Fatal编程技术网

Regex gVim使用正则表达式在每个匹配模式之前插入序列号

Regex gVim使用正则表达式在每个匹配模式之前插入序列号,regex,vim,number-sequence,Regex,Vim,Number Sequence,我正在Windows上使用gVim。我有一个XML文件,其内容(提取)如下: <ExtendedAttributes /> </Activity> <Activity Id="ded54c70-1ef4-4aeb-852e-3740882c36ff" Name="Activity 1"> <Performers> <Performer>2212646c-2674-4329-9ddc

我正在Windows上使用gVim。我有一个XML文件,其内容(提取)如下:

      <ExtendedAttributes />
    </Activity>
    <Activity Id="ded54c70-1ef4-4aeb-852e-3740882c36ff" Name="Activity 1">
      <Performers>
        <Performer>2212646c-2674-4329-9ddc-1f8376e952e1</Performer>
      </Performers>
    </Activity>
    <Activity Id="cf70ec72-4d49-434a-abf3-aa3e8dc000b5" Name="Activity 2">
      <Description>This is a dummy description</Description>
      <Implementation>
        <Task />
但它只是用数字代替了名字

:let @a=1 | %s/\(<Activity Id="[0-9a-f-]*" Name="\)\@<=\([A-Za-z() ,&?;/]\+\)/\=(@a+setreg('a',@a+1)).\2/g

:让@a=1 |%s/\(假设您所需的ID是
活动
后面的数字乘以10(这是我从您的示例中理解的),这可以通过以下方法完成:

:%s/Activity \(\d\+\)/\=submatch(1) * 10 . " " . submatch(0)
崩溃

  • 对每一行执行替换:

    :%s/...
    
  • 搜索
    活动
    ,后跟空格,后跟一个或多个数字,捕获数字:

    .../Activity \(\d\+\)/...
    
  • 在“子替换表达式”中使用捕获的数字和整个匹配项:

    在这里,我们将捕获的数字连接为10、一个空格和整个匹配

    请参见
    :帮助子系统更换


我终于想出了一种方法,分两步完成这项任务:

1) 通过以下命令插入不可能出现在内容中的静态字符串(例如##%%##%%):


:%s/\(此项仅在行末尾的活动中更改。
首先,我们分别尝试搜索

/Name="\zs[^"]*\ze"
然后问我们亲爱的维姆

let @a=10 | %s//\=(@a+setreg('a', @a+10)) . " " . submatch(0)

您应该为一次操作录制一个宏,并将其用于所有相关行(可能是通过全局,您可以根据正则表达式定义相关行(对于多个文件,您还可以使用类似bufdo的内容))。我添加了我尝试过的命令。谢谢。抱歉。否,“活动1”,“活动2”只是活动名称的一个示例。它可以是任何ASCII字符(与ID无关)。无论如何,谢谢。给我们一个真实的示例怎么样?文件摘录确实是我正在处理的真实文件(除了我将活动名称改短)。这是一个xpdl格式的流程文档。由于我的process modeler无法在图表中显示活动ID,因此我希望更改活动名称以包含ID(以便与流程文档匹配)。完整的文件相当长(对于只有3个任务的流程,大约420行)对我来说,将submatch()与我的“Let@a=1 |……”结合在一起并不是一个好主意。哦!我设法一步解决了这个问题。
:Let@a=1 |%s/\(谢谢。但是活动的名称不必命名为“活动”。因此我更改了我的正则表达式来解决这个问题。现在它不依赖于任何单词-
:let @a=1 | %s/\(<Activity Id="[0-9a-f-]*" Name="\)\@<=\([A-Za-z() ,&?;/]\+\)/\=(@a+setreg('a',@a+1)).' '.\2/g
:let @a=1 | %s/\(<Activity Id="[0-9a-f-]*" Name="\)\@<=\([A-Za-z() ,&?;/]\+\)/\=join((@a+setreg('a',@a+1)),' ',\2)/g
:let @a=1 | %s/\(<Activity Id="[0-9a-f-]*" Name="\)\@<=\([A-Za-z() ,&?;/]\+\)/\=(@a+setreg('a',@a+1))+\2/g
:%s/Activity \(\d\+\)/\=submatch(1) * 10 . " " . submatch(0)
:%s/...
.../Activity \(\d\+\)/...
.../\=submatch(1)*10 . " " . submatch(0)
/Name="\zs[^"]*\ze"
let @a=10 | %s//\=(@a+setreg('a', @a+10)) . " " . submatch(0)