如何使用regexp一次搜索和替换3个作业

时间:2016-06-07 08:31:00

标签: regex

我正在使用一个名为ASR(实际搜索和替换)的程序,该程序内置了一些强大的功能,可以使用regexp搜索文本并替换它。

我正在使用它,我将其编写到我的工作流程中。

问题是,我需要替换三个搜索来更正配置文件(仅从这三行中删除“ - ”),这都是手动工作而且非常耗时。

配置文件在文件中随机出现以下行,它们可以多次出现,名称和数字不同。他们总是在一条线上。

<id>filename-33</id>
<source>#filename-33</source>
<url>{filename-33}</url>

所需的输出应为:

<id>filename33</id>
<source>#filename33</source>
<url>{filename33}</url>

两个“filename”作为数字“33”可以是任何东西(文件名总是一个小写的名字,没有特殊字符,而且数字总是从0到1000的数字)。

我知道如何找到并替换所有三行:

<source>#(.*)-     replace with      <source>#$1
<url>{(.*)-        replace with      <url>{$1
<id>(.*)-          replace with      <id>$1

但这必须分三次完成。

我的问题是,是否可以只使用一条查找行和一条替换行进行搜索和替换?

此致

阿尔扬

2 个答案:

答案 0 :(得分:1)

您可以使用alternation(使用|管道运算符)创建一个匹配所有3个模式的单个表达式,并创建一个替换。

取代此模式:

(?:<source>(?=#)|<url>(?={)|<id>)([^-]+)-
$1$2

应该会产生正确的输出。

https://regex101.com/r/mS3mP9/3

分析表达式:

(             // begin capturing group
    <source># // find the opening <source> tag followed by a #
  | <url>{    //  ...or find the opening <url> tag followed by a {
  | <id>      // ...or find the opening <id> tag
)             // end capturing group
([^-]+)       // capture everything that is not a hyphen
-             // match and consume the hyphen

答案 1 :(得分:1)

可以使用^(<(?:id|source|url)>(#|\{)?\w+)-完成,并将$1替换为here