我真的不擅长使用regexp,所以请原谅我。
我有一块ActionScript代码,应该评估一个字符串的HTML,并把它分解成单独的部分。所以像<p>Hi</p><span>Hi</span><a href="index.php">Hi</a>
这样的字符串会被翻译成:
1. <p>Hi</p>
2. <span>Hi</span>
3. <a href="index.php">Hi</a>
...
然而,当我运行这段代码的测试版本时,我得到的值是null。我很确定我的regexp字符串是好的,但我在ActionScript做错了什么。你能指出正确的方向吗?我的代码如下:
var evaluatedInput:RegExp = new RegExp('/<([A-Z][A-Z0-9]*)b[^>]*>(.*?)</1>/');
var output:Object = evaluatedInput.exec("<p>Hi</p><span>Hi</span><a href="index.php">Hi</a>");
trace(output);
谢谢你的时间,
spryno724
在ActionScript你应该创建一个RegExp对象的两种方式之一。您可以用/.../
分隔符将表达式括起来,形成一个正则文本:
/<([A-Z][A-Z0-9]*)b[^>]*>(.*?)</1>/gi
…或者您可以将其写成字符串字面值,并将其传递给RegExp构造函数:
new RegExp('<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>', 'gi')
你似乎在使用这两种方法的混合物,结果得到了垃圾。其他一些兴趣点:
因为正则表达式使用正斜杠作为分隔符,所以正则表达式中的任何
/
都需要用反斜杠进行转义,例如,</1>
在字符串版本中,它是反斜杠你必须转义(例如,
</\1>
)。否则,AS编译器会尝试将其视为字符串转义序列的一部分,如"
或n
。在您的代码中,b
表示退格,而不是字边界,并且1
可能被视为语法错误,而不是您想要的向后引用。你的正则表达式需要
g
("global")和i
("ignore-case")修饰符;我已经演示了如何应用它们
例子使用
改编自此
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/RegExp.html exec ()
var myPattern:RegExp = /></g;
var str:String = "<p>Hi</p><span>Hi</span><a href="index.php">Hi</a>";
var result:Object = myPattern.exec(str);
//To loop through all results manually
while (result != null) {
trace ( result.index, "t", result);
result = myPattern.exec(str);
}
//or, just replace. Note this does not required the myPattern.exec(str);
str.replace(myPattern, ">n<");
原始回答
查看答案:
AS3 RegEx返回null
至少,gSkinner的工具应该能解决你的问题。
具体来说,要做您想做的事情,您将使用以下正则表达式:
/></g
在您的匹配,使用索引值,并替换为:
>n<
您可以在gskinner Regexr工具上使用Replace选项卡进行测试。