带有多个参数和表达式的javascript拆分字符串

带有多个参数和表达式的javascript拆分字符串,javascript,regex,Javascript,Regex,我有以下的表达: where('publishedDate').gte(new Date('2015-08-21T20:37:45.176Z')).sort({ field: 'asc', test: -1 }); 我希望使用javascript的string::split(regex)将其解析为以下标记: 但我很难想出一个合适的表达方式。非常感谢您的帮助 您可以使用这个: /(\w+)(\(.+?\)(?=\.|;|$))/g 它对你的输入很有效 演示: 如何仅获取匹配的令牌: var

我有以下的表达:

where('publishedDate').gte(new Date('2015-08-21T20:37:45.176Z')).sort({ field: 'asc', test: -1 });
我希望使用javascript的string::split(regex)将其解析为以下标记:

但我很难想出一个合适的表达方式。非常感谢您的帮助

您可以使用这个:

/(\w+)(\(.+?\)(?=\.|;|$))/g
它对你的输入很有效

演示:

如何仅获取匹配的令牌:
var re=/(\w+)(.+?\)(?=\.)/g,
str=“where('publishedDate').gte(新日期('2015-08-21T20:37:45.176Z')).sort({field:'asc',test:-1});”,
结果=[],
arr;
while(arr=re.exec(str)){
结果推送(arr[1]);
结果推送(arr[2]);
}
document.getElementById('result').innerHTML=JSON.stringify(result,null,2)

您将无法使用JS的正则表达式来解析包含嵌套大括号的文本,因为它们没有合适的机制。例如,在PCRE的递归正则表达式或.NET的平衡组中,这是可能的,但JS没有这样的功能。手工编写标记器,一点也不复杂。正则表达式不可能?难以相信:-)我会接受第二或第三种意见,如果这也表明这是不可能的,那么我会找到一种不同的方法。谢谢@webteckie:JavaScript的正则表达式与PCRE等相比相对较弱。(这来自JavaScript fanboi。)Lucas说得很对,他没有处理任意嵌套事物的方法(比如你例子中的Paren)。正则表达式可以是解决方案的一部分,但不能是整个解决方案。@webteckie不要误解我的意思-因为(我只是在这里展示了一个肮脏的示例)。只是不要期望能够对JS的死气沉沉的正则表达式做同样的事情;)谢谢但是,由于某些原因,节点中的string.split返回以下内容,因此捕获的点与演示中不同:[“where”,“publishedDate”,“gte”,“new Date(\'2015-08-21T20:37:45.176Z\),”。排序({field:\'asc\',test:-1})奇怪。如果我在节点控制台中执行相同的操作,我会得到与您相同的结果。但是如果我通过字符串拆分以编程方式进行,我会得到…,“.sort({field:'asc',test:-1})”,其中.sort不正确。输入将被匹配的标记拆分,因此您得到的是正确的。如果您只想提取这些标记,请参阅我添加的代码段。我将如何处理正则表达式以使输入表达式中的分号成为可选的?如果我将其更改为/(\w+)(.+?)(?=\.|?)/g,则“新日期”表达式周围的括号将丢失。将其更改为
(?=\.|;$)
,这意味着:
$
(行尾)。Regex在回答中进行了更新,以解释此案例。
/(\w+)(\(.+?\)(?=\.|;|$))/g
var re = /(\w+)(\(.+?\)(?=\.|;))/g,
    str = "where('publishedDate').gte(new Date('2015-08-21T20:37:45.176Z'))" +
          ".sort({ field: 'asc', test: -1 });",
    result = [],
    arr;

while(arr = re.exec(str)) {
  result.push(arr[1]);
  result.push(arr[2]);
}