感谢您抽出时间阅读本文并立即道歉,如果这有点令人困惑,补救或以前曾被问过(广泛搜索,结果有限)。
如果您熟悉,我正在使用古老的软件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早期的格式更正。
答案 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.