我有以下字符串s1
,作为较长文本的一部分(其中没有以下模式,即此模式仅在文本中发生一次。文本还包括空格和新线)
<!-- COMPONENTS_LIST_START -->
* [line-vis](line-chart)
* [trend-vis](trend-vis)
<!-- COMPONENTS_LIST_END -->
我想用以下字符串s2
替换它:
<!-- COMPONENTS_LIST_START -->
* [line-vis](line-chart)
* [trend-vis](trend-vis)
* [common-vis](common-vis)
<!-- COMPONENTS_LIST_END -->
我使用以下RegEx但它与之不匹配:
str1.replace(/<!-- COMPONENTS_LIST_START -->(\s|.)*<!-- COMPONENTS_LIST_END -->/, str2)
这不是:(\s|.)*
是什么意思,包括空白字符在内的所有字符?
答案 0 :(得分:2)
你正在使用贪婪的正则表达式,所以你会弄乱。顺便说一下,你可以使用[\S\s]
ungreedy代替:
str1.replace(/<!-- COMPONENTS_LIST_START -->[\S\s]*?<!-- COMPONENTS_LIST_END -->/, str2)
[\S\s]*?
背后的想法是匹配所有内容,直到第一次出现您的模式为止<!-- COMPONENTS_LIST_END -->
正如Trott在他的回答中指出的那样,给字符串分配一个结果:
str1 = str1.replace(/<!-- COMPONENTS_LIST_START -->[\S\s]*?<!-- COMPONENTS_LIST_END -->/, str2);
答案 1 :(得分:2)
你的正则表达式有效。您遇到的问题是.replace()
不会改变字符串。它返回一个新字符串。如果您希望它改变字符串,则需要指定返回值。
str1 = str1.replace(/<!-- COMPONENTS_LIST_START -->(\s|.)*<!-- COMPONENTS_LIST_END -->/, str2);