可以使用正则表达式正确地拆分函数属性吗?我想要一个表达式,它将所有属性分割成逗号分隔的列表。但属性本身可以是Array或Object,或者还可以包含逗号的内容:
例如:
'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中尝试这样做,顺便说一下,这是一些可以拆分所有逗号的代码(这当然不是我想要的):
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发布于 2009-11-22 06:33:56
我已经创建了一个小例子来解决这样的问题,只是在你的输入上进行了测试,所以它可能包含可怕的错误。它只考虑圆括号,而不考虑(花括号),但这些可以很容易地添加。
基本思想是遍历输入中的字符,如果它们不是分隔符字符,则将它们添加到当前标记中,并在遇到分隔符时将当前标记推入结果数组。你必须添加一个堆栈来跟踪你的嵌套深度,以确定逗号是分隔符还是标记的一部分。
对于任何比这更复杂的问题,你最好使用一个“真正的”解析器(可能还有一个解析器生成器),但在这种情况下,我认为你可以使用一些定制的代码。
正如您所看到的,像这样解析代码很快就会变得非常难以理解和调试。在真实的场景中,我建议添加更多的注释,但也要添加一批很好的测试来解释您的预期行为。
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;
}
}
}https://stackoverflow.com/questions/1776683
复制相似问题