如何使用正则表达式在先前搜索的结果中搜索和替换?

时间:2013-11-22 13:58:35

标签: javascript regex search replace jscript

感谢您抽出时间阅读本文并立即道歉,如果这有点令人困惑,补救或以前曾被问过(广泛搜索,结果有限)。

如果您熟悉,我正在使用古老的软件HomeSite 5进行编辑,并允许使用脚本。

我的难题如下:

  

我想隔离多个文本选择。我目前正在使用(冗长的)正则表达式执行此操作,该正则表达式捕获特定特定设置日期之后的所有内容(在此实例中为“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

现在我已经在公开场合输入了这个,我知道它是一个正则表达式的恐怖节目,我向stackoverflow的优秀编码器道歉,甚至不得不看一下!

编辑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早期的格式更正。

1 个答案:

答案 0 :(得分:2)

使用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.

假设您要将每个foo替换为bar,但仅限于这些部分。这可以通过使用回调函数作为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")。如果正则表达式具有捕获组,则每个组的匹配文本将在以下参数中传递(在这种情况下,只有一个捕获组,我将此参数命名为:"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.