我正在尝试编写一个正则表达式来根据第一个和最后一个字符拆分输入字符串。
例如
input : "$(tag1)sample$(tag2)"
output : ["$tag1", "sample", "$tag2"]
var input = $(tag1)sample$(tag2);
var splitStrings = input.split(/^$|)$/);
但是得到以下错误:
无效的正则表达式:
/^$|)$/
:不匹配的")"。
请注意,$
和)
是特殊的正则表达式元字符,如果您需要从字面上匹配这些字符,则必须对其进行转义或放入[...]
字符类中。
但是,在这种情况下,逃离它们对您不起作用。您可以在排位赛中与/($([^()]+))/
拆分,删除空条目并删除括号:
var input = "$(tag1)sample$(tag2)";
var splitStrings = input.split(/($([^()]+))/);
console.log(
splitStrings.map(function(x) {
return x.replace(/^$((.*))$/, '$$$1');
}
).filter(Boolean)
);
这里的重点是:
- 用
($([^()]+))
拆分,我们得到一个$(...)
数组和所有与此模式不匹配的文本块 - 我们需要从通常带有这种拆分操作的数组中删除空字符串(因此,应使用
filter(Boolean)
或类似
) - 我们需要在与拆分模式匹配的条目中用
$
替换$(
和)
- 在
.replace(/^$((.*))$/, '$$$1')
中,替换有 3$
s,因为要用单$
替换,我们需要在字符串替换模式中将其加倍,第 3 个形成反向引用$1
。
像这样转义)
字符:/^$|)$/
)
是正则表达式中的保留符号,这意味着您必须告诉引擎将其视为字符,这就是所做的。
错误的原因是您必须转义正则表达式中具有特殊含义的字符,例如)
和$
。
但是仅仅修复它不会让你得到你正在寻找的输出,你想在特殊标签上拆分,删除标签中的()
,并保留它们。我不认为 JavaScript 的正则表达式有一个单一的正则表达式解决方案(也许有人比我知道一种方法更聪明,但随着转换$(tag1)
到$tag1
我还没有到达那里)。但是我们可以通过几个替换和拆分来到达那里:
var input = "$(tag1)sample$(tag2)";
var splitStrings = input.replace(/$(([^)]+))/g, "t$$$1t")
.replace(/(?:^t+)|(?:t+$)/g, '')
.split(/t+/);
console.log(splitStrings);
第一个替换将$(tag1)
转换为t$tag1t
(例如,在其周围放置选项卡并删除()
)。第二个替换删除了任何前导和尾随制表符。然后,拆分会在任何选项卡序列上拆分。
当然,如果字符串中可能出现制表符并且您想保留它们,只需将它们替换为其他适合的内容即可。