如何使用regex在以前的搜索结果中进行搜索和替换

How can I search and replace, using regex, within the results of a previous search?

本文关键字:搜索 替换 搜索结果 regex 何使用      更新时间:2023-09-26

感谢您花时间阅读本文,如果这有点令人困惑、补救或之前有人问过(大量搜索,结果有限),请立即道歉。

我正在使用过时的软件进行编辑,如果你熟悉的话,HomeSite5,它允许使用脚本。

我的难题如下:

我想隔离多个文本选择。我目前使用的是一个(冗长的)regex,它捕获特定设置日期(在本例中为"2030-12-31")之后的所有内容,直到它到达某个标记(在本实例中为]]<content>)。到目前为止,我已经做到了。

然后,我只想在之前找到的文本选择中删除它包含的所有<span>标记。但是,我希望文本的其他部分中的<span>标记保持不变(例如那些分配了较早日期的标记)。

我可以单独执行这两个功能,隔离特定部分或删除所有<span>标签,我觉得只有一个我不知道的链接可以让我在另一个中运行一个。

如果答案很简单,再次道歉;我对脚本和正则表达式的了解充其量是有限的。我的大部分工作都是使用Jscript完成的,但我不确定HomeSite是否接受其他格式——我对多种解决方案持开放态度!

TLDR:仅在特定选择中搜索和替换,如前一个正则表达式所指定。

编辑1:请参阅下面用于隔离所需部分的表达式。第一个是整个表达式。第二个是捕获内容的容器

/<version recordId="([0-9]{4,})" start="2030-12-31"([^>]*)>([^<]*)<title><!'[CDATA'[<span class="uk">([^<]*)<'/span>']']><'/title>([^<]*)<number><!'[CDATA'[<span class="uk">([0-9]{1,3})'.<'/span>']']><'/number>([^<]*)<content><!'[CDATA'[([^]]*)']']><'/content>([^<]*)<'/version>/g;
..<content><!'[CDATA'[([^]]*)']']></content>..

在此范围内,我将跳到修改如下:

<span class="uk">content</span>
content

既然我已经在公共场合把它打出来了,我就知道这是一个多么恐怖的常规表达节目,我向斯塔克弗洛的优秀程序员道歉,因为他们不得不看它!

编辑2:请参阅以下所需输出的示例:

<version recordId="1234" start="2012-01-01"><stuffhere...<content><![CDATA[[
  <span class="uk">content1</span>
  <span class="uk">content2</span>
 ]]</content>
    </version>
 <version record="4231" start="2030-12-31"><stuffhere...<content><![CDATA[[
   <span class="uk">content1</span>
   <span class="uk">content2</span>
 ]]</content>
    </version>

BECOMES

<version recordId="1234" start="2012-01-01"><stuffhere...<content><![CDATA[[
  <span class="uk">content1</span>
  <span class="uk">content2</span>
 ]]</content>
    </version>
 <version record="4231" start="2030-12-31"><stuffhere...<content><![CDATA[[
   content1
   content2
 ]]</content>
    </version>

n.b:感谢Hannele早期的格式更正。

使用带有String.replace()的回调函数

String.replace()方法的第二个参数(替换文本)可以指定为回调函数。这个回调函数又可以有另一个replace()调用。通过这种方式,您可以轻松地处理一节中的文本。下面是一个演示该技术的示例。

给定此示例文本:

之前:

blah foo? foo blah foo, foo.
<section1>blah foo? foo blah foo, foo.</section1>
blah foo? foo blah foo, foo.
<section2>blah foo? foo blah foo, foo.</section2>
blah foo? foo blah foo, foo.

假设您希望用bar替换每个foo,但仅限于部分。通过使用回调函数作为String.replace()方法的替换参数,可以很容易地做到这一点,如下所示:

function f1(text) {
    var re1 = /<section('d+)>['S's]*?<'/section'1>/g;
    var re2 = /foo/ig;
    text = text.replace(re1,
        function(m0, m1){
            return m0.replace(re2, 'bar');
        });
    return text;
}

当找到模式匹配时,replace()方法调用回调函数,并在第一个参数中传递整个匹配(在上面的示例中,我将其命名为:"m0")。如果regex有捕获组,则这些组中每个组的匹配文本都会在以下参数中传递(在这种情况下,只有一个捕获组,我将此参数命名为:"m1"-请注意,该函数不使用此参数)。

以下是经过上述功能处理后的示例文本:

之后:

blah foo? foo blah foo, foo.
<section1>blah bar? bar blah bar, bar.</section1>
blah foo? foo blah foo, foo.
<section2>blah bar? bar blah bar, bar.</section2>
blah foo? foo blah foo, foo.