使用带有多个标记的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) 我想允许\)和\(在输入值中,拆分时不应考虑它。 我希望预期输出如下

我想使用正则表达式拆分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)

我想允许\)和\(在输入值中,拆分时不应考虑它。

我希望预期输出如下所示:

  • 关键1
  • 名称\(1,val1)
  • 键2
  • val\)2
如何使用regex实现它?

您可以使用:

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…我当时想得很清楚,然后意识到我错了。我不打算真的发表那个评论…看起来像是我的解决办法。