我正在尝试编写一个正则表达式来根据第一个和最后一个字符拆分输入字符串。
例如
input : "$(tag1)sample$(tag2)"
output : ["$tag1", "sample", "$tag2"]
var input = $(tag1)sample$(tag2);
var splitStrings = input.split(/^$|)$/);
但出现以下错误:
Invalid regular expression:
/^$|)$/
: Unmatched ')'.
最佳答案
请注意,$
和 )
是特殊的正则表达式元字符 - 如果您需要按字面匹配这些字符 - must be escaped或放入 [...]
字符类中。
但是,在这种情况下,逃避它们对您不起作用。您可以使用 /(\$\([^()]+\))/
进行拆分,删除空条目并删除限定匹配中的括号:
var input = "$(tag1)sample$(tag2)";
var splitStrings = input.split(/(\$\([^()]+\))/);
console.log(
splitStrings.map(function(x) {
return x.replace(/^\$\((.*)\)$/, '$$$1');
}
).filter(Boolean)
);
这里的要点是:
- 使用
(\$\([^()]+\))
进行拆分,我们得到一个$(...)
数组以及与此模式不匹配的文本 - 我们需要从数组中删除通常伴随这种分割操作的空字符串(因此,应该使用
filter(Boolean)
或类似的方法) - 我们需要将与拆分匹配的条目中的
$(
and)
替换为$
图案 - 在
.replace(/^\$\((.*)\)$/, '$$$1')
中,替换有 3 个$
,因为要替换单个$
,我们需要在字符串替换模式中将其加倍,而第三个形成反向引用$1
。
关于用于闭括号的 JavaScript 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46033667/