您可以使用正则表达式正确分割函数属性吗? 我想要一个表达式,分隔逗号分隔列表中的所有属性。但属性本身可以是数组或对象,也可以包含逗号:
前:
'string1','string2',sum(1,5,8), ["item1","item2","item3"], "string3" , {a:"text",b:"text2"}
这应该分为:
'string1'
'string2'
sum(1,5,8)
["item1","item2","item3"]
"string3"
{a:"text",b:"text2"}
因此表达式应该分割所有逗号,但不包括由(),{}或[]包围的逗号。
我在as3 btw中尝试这个 这里有一些代码可以分割所有逗号(这不是我想要的):
var attr:String = "'string1','string2',sum(1,5,8), ['item1','item2','item3'], 'string3' , {a:'text',b:'text2'}";
var result:Array = attr.match(/([^,]+),/g);
trace(attr);
for(var a:int=0;a<result.length;a++){
trace(a,result[a]);
}
这是一个表达式,允许嵌套的圆括号,但不允许其他的......
/([^,]+\([^\)]+\)|[^,]+),*/g
答案 0 :(得分:1)
我已经创建了一个小例子如何处理这样的问题,只测试你的输入,所以它可能包含可怕的错误。它只考虑括号而不是(卷曲)括号,但可以很容易地添加。
基本思想是迭代输入中的字符并将它们添加到当前标记(如果它们不是分隔符char),并在遇到分隔符时将当前标记推送到结果数组中。您必须添加一个堆栈,该堆栈将跟踪嵌套的“深度”,以确定逗号是分隔符还是令牌的一部分。
对于任何比这更复杂的问题,你可能会更好地使用“真正的”解析器(可能还有解析器生成器),但在这种情况下,我认为你可以使用一些自定义代码。
正如您所看到的那样快速解析代码变得非常难以理解/调试。在实际情况中,我建议添加更多注释,但也需要一大堆测试来解释您的预期行为。
package {
import flash.display.Sprite;
public class parser extends Sprite
{
public function parser()
{
var input:String = "'string1','string2',sum(1,5,8), [\"item1\",\"item2\",\"item3\"], \"string3\" , {a:\"text\",b:\"text2\"}"
var result:Array = parseInput(input);
for each (var item:String in result)
{
trace(item);
}
}
// this function only takes into account the '(' and ')' - adding the others is similar.
private function parseInput(input:String):Array
{
var result:Array = [];
trace("parsing: " + input);
var token:String = "";
var parenthesesStack:Array = [];
var currentChar:String;
for (var i:int = 0; i < input.length; i++)
{
currentChar = input.charAt(i)
switch (currentChar)
{
case "(":
parenthesesStack.push("(");
break;
case ")":
if (parenthesesStack.pop() != "(")
{
throw new Error("Parse error at index " + i);
}
break;
case ",":
if (parenthesesStack.length == 0)
{
result.push(token);
token = "";
}
break;
}
// add character to the token if it is not a separating comma
if (currentChar != "," || parenthesesStack.length != 0)
{
token = token + currentChar;
}
}
// add the last token
if (token != "")
{
result.push(token);
}
return result;
}
}
}