用于解析类似JavaScript函数调用语法的正则表达式

4
我有以下数据可能性。
fnname()
fnname(value)
fnname(value,valueN)

我需要一种用JavaScript正则表达式解析它并获得一个数组的方法。
[fnname]
[fnname,value]
[fnname,value,valueN]

感谢您提前的支持!

2
你需要处理嵌套函数调用吗,例如 f(g(h(value))) - Nikola Dimitroff
不,只有这个数据集。 - rnrneverdies
@AvinashRajпјҡжҲ‘жҖҖз–‘OPеұ•зӨәдәҶ[е’Ң]жқҘиЎЁзӨәж•°з»„гҖӮ - anubhava
@anubhava 是的,现在我才意识到。 - Avinash Raj
@anubhava 是的,[] 表示数组表示法。如果不清楚,抱歉。 - rnrneverdies
valueN 是指任何值(例如数字、带引号的字符串)还是它们只是标识符? - georg
5个回答

2
这应该适用于您:

这对于您来说应该可行:

var matches = string.split(/[(),]/g).filter(Boolean);
  • 正则表达式 /[(),]/g 用于在字符类中按照这3个字符之一进行分割。
  • filter(Boolean) 用于从结果数组中丢弃所有空结果。

示例:

'fnname()'.split(/[(),]/g).filter(Boolean);
//=> ["fnname"]

'fnname(value,value2,value3,value4)'.split(/[(),]/g).filter(Boolean);
//=> ["fnname", "value", "value2", "value3", "value4"]

3
.filter(Boolean) 是一个新的用法。 - Derek 朕會功夫

2

你可以尝试匹配而不是分割字符串,

> var re = /[^,()]+/g;
undefined
> var matches=[];
undefined
> while (match = re.exec(val))
... {
... matches.push(match[0]);
... }
5
> console.log(matches);
[ 'fnname', 'value', 'value2', 'value3', 'value4' ]

或者

> matches = val.match(re);
[ 'fnname',
  'value',
  'value2',
  'value3',
  'value4' ]

matches = val.match(re) 看起来比循环更简单。 - user663031

2

参考其他答案并根据标识符的规则,我们可以得到一些灵感:

str.match(/\w+/g)

1
使用split的方法如下:
var val = "fnname(value,value2,value3,value4)";
var result = val.split(/[\,\(\)]+/);

这将产生:

["fnname", "value", "value2", "value3", "value4", ""]

请注意需要处理空条目 :) 您可以使用Array.filter来完成:

result = result.filter(function(x) { return x != ""; });

最后一个位置为空值,不应该出现吗? - Braj
在字符集内转义逗号或括号有什么意义呢?而且,这会匹配像“fname(),()((a)”这样的内容,看起来很奇怪。 - user663031

1

以下是一行代码实现的方法:

"fnname(value,value2,value3,value4)".split(/[\(,\)]/g).slice(0, -1);

这将被评估为什么?
["fnname", "value", "value2", "value3", "value4"] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接