使用带有多个标记的javascript正则表达式拆分字符串,并考虑转义分隔符
我想使用正则表达式拆分javascript中的字符串 输入:使用带有多个标记的javascript正则表达式拆分字符串,并考虑转义分隔符,javascript,regex,Javascript,Regex,我想使用正则表达式拆分javascript中的字符串 输入:key1(name1,val1)key2(val2) 预期输出: 关键1 名字1,val1 键2 瓦尔2 如果我使用这个'key1(name1,val1)key2(val2)'.match(/[^\(\)]+/g)对上面的字符串很好,但对转义括号无效 例如:以下输入失败'key1(name\(1,val1)key2(val\)2')。匹配(/[^\(\)]+/g) 我想允许\)和\(在输入值中,拆分时不应考虑它。 我希望预期输出如下
key1(name1,val1)key2(val2)
预期输出:
- 关键1
- 名字1,val1
- 键2
- 瓦尔2
'key1(name1,val1)key2(val2)'.match(/[^\(\)]+/g)
对上面的字符串很好,但对转义括号无效
例如:以下输入失败'key1(name\(1,val1)key2(val\)2')。匹配(/[^\(\)]+/g)
我想允许\)和\(在输入值中,拆分时不应考虑它。
我希望预期输出如下所示:
- 关键1
- 名称\(1,val1)
- 键2
- val\)2
var re = /([^(]+)\(([^)]+)\)/g,
matches = [],
input = "key1(name1,val1)key2(val2)";
while (match = re.exec(input)) { matches.push(match[1]); matches.push(match[2]) };
console.log(matches);
//=> ["key1", "name1,val1", "key2", "val2"]
我想你也可以这样做 包括换行符:
# (?:[^()\\]+|\\[\S\s])+
(?: [^()\\]+ | \\ [\S\s] )+
# (?:[^\n()\\]+|\\.)+
(?: [^\n()\\]+ | \\ . )+
排除换行符:
# (?:[^()\\]+|\\[\S\s])+
(?: [^()\\]+ | \\ [\S\s] )+
# (?:[^\n()\\]+|\\.)+
(?: [^\n()\\]+ | \\ . )+
Perl测试用例
$/ = undef;
$str = <DATA>;
while ( $str =~ /(?:[^\n()\\]+|\\.)+/g )
{
print "'$&'\n";
}
__DATA__
key1(name1,val1)key2(val2)
key3(name\(3,val3)key4(val4)
这个怎么样:
result = subject.match(/(?:\\.|[^()])+/g);
看到了
说明:
(?:#启动一个与。。。
\\.#要么是转义字符
|#或
[^()]#除括号外的任何字符
)+#一次或多次。
我认为您必须避开反斜杠“\\”,还值得注意的是,如果支持Javascript,这将非常容易,但是@jxpx777:在这种情况下不需要查找,仍然很容易(但一般来说,我同意您的看法。Javascript的正则表达式引擎没有那么好……)感谢您的快速回复,您的正则表达式几乎可以为我工作,但在我的预期输出中有一个小的更正,我希望第二个值为'name\(1,val1',而不是'name(1,val1',但您的原始输入没有\(
?为什么您希望在输出中使用此项?在我的第二个示例中,我已经说过此输入键1(name\(1,val1))失败KEY2(VAL2)应该写成:<代码> KEY1(name \(1,VAL1)KEY2(VAL2)如果输入字符串包含转义结束括号,则您的解决方案不起作用。KI1(名称“1”,VAL1)KE2(VAL2)您的解决方案也不考虑)。(在输入值中,分割时不应考虑它。@Anks-真的吗?Tim Pietzcker 2小时前的解决方案,您接受的是我的解决方案。区别是我的运行速度快了5倍,我在22小时前回答了。您的评论是错误的,它考虑了从我的测试用例中看到的所有转义字符。我建议这正是我想要的。谢谢蒂姆:)这让你有(@jxpx777:我不这么认为-你能举个例子吗?Eep…我当时想得很清楚,然后意识到我错了。我不打算真的发表那个评论…看起来像是我的解决办法。