Javascript 用于提取括号和函数名的正则表达式

Javascript 用于提取括号和函数名的正则表达式,javascript,regex,Javascript,Regex,有人帮我写以下情况的正则表达式吗 somestring()=>['somestring'] somestring()[10]=>['somestring','',10] somestring('argString')=>['somestring','argString'] somestring('argString')[10]=>['somestring','argString',10] somestring({prop1:'v1',prop2:'v2'})=>['somestring',{p

有人帮我写以下情况的正则表达式吗

  • somestring()=>
    ['somestring']
  • somestring()[10]=>
    ['somestring','',10]
  • somestring('argString')=>
    ['somestring','argString']
  • somestring('argString')[10]=>
    ['somestring','argString',10]
  • somestring({prop1:'v1',prop2:'v2'})=>
    ['somestring',{prop1:'v1',prop2:'v2'}]

  • somestring({prop1:'v1',prop2:'v2'})[100]=>
    ['somestring',{prop1:'v1',prop2:'v2'},100]

这是我到目前为止试过的

var regExp = /\b[^()]+\((.*)\)+\[(.*?)]/;
var matches = regExp.exec('somestring()[10]');

您只需要排除右括号:

var regExp = /\b[^()]+\(([^)]*)\)(\[[^\]]*\])?/;
但是,如果您有如下字符串,则会断开:

somestring({myKey: myFunc()})[myArray[0]]
这可能会奏效:

var input = ['somestring()', 'somestring()[10]', "somestring('argString')", "somestring('argString')[10]", "somestring({prop1:'v1',prop2:'v2'})", "somestring({prop1:'v1',prop2:'v2'})[100]"];

console.log(input.map(function(v) {
  let result = v.match(/(.*)\((.*)\)(\[([^\]]*)\])?/);

  return [result[1], result[2], result[4]];
}));
您可以从匹配项中否定
[
]

let re = /[^()\[\]]+/g;

let res = "somestring({prop1:'v1',prop2:'v2'})[100]".match(re);

我将尝试使用代理处理此问题,如下所示:

constsomestring=newproxy(()=>{}{
应用(目标,thisArg,[arg=''){
返回新代理(['somestring',arg]{
获得(目标、道具){
如果(!isNaN(String(prop)))返回[…target,prop];
返回目标[道具];
}
});
}
});
console.log(
somestring(),
somestring()[10],
somestring('argString'),
somestring('argString')[10],
somestring({prop1:'v1',prop2:'v2'}),
somestring({prop1:'v1',prop2:'v2'})[100]
);
这在node中正常工作,但在Chrome devtools控制台中不能正常工作,因为后者在使用
console.log
序列化到控制台时,显然试图调用每个元素上的
get

节点输出:

[ 'somestring', '' ] 
[ 'somestring', '', '10' ] 
[ 'somestring', 'argString' ] 
[ 'somestring', 'argString', '10' ] 
[ 'somestring', { prop1: 'v1', prop2: 'v2' } ] 
[ 'somestring', { prop1: 'v1', prop2: 'v2' }, '100' ]

这里的基本思想是创建一个函数代理,它在被调用时(
apply
)返回
['somestring',arg]
数组,但也会围绕一个代理来捕获属性访问(
get
),例如
[10]
,并返回
['somestring',arg 10]
在这种情况下。

为什么要使用regexp来解码JS?你打算对结果做什么?您是否需要处理类似于
somestring(foo(bar))
,或
somestring(foo[10](bar))
,或
somestring(foo(bar)[10])
,或
somestring({prop1:foo(bar)[10]})
?@torazaburo,我唯一关心的是将内容放在Paranthesis中。在这种情况下,使用regexp将非常困难,因为regexp不能很好地处理嵌套语法。你能在我们的问题中添加这样一个例子,让其他回答问题的人有测试用例来反对吗?一个小小的解析器可能会对你更好。@torazaburo我在问题中提到了我所有的用例,没有别的了。一方面,你说“括号内任何东西都可以存在”,这意味着它可以包含额外的嵌套括号或括号,但你说“我已经提到了我所有的用例,没有别的了”。哪一个?谢谢,如果函数中没有参数,是否可以添加空值?