在AS3中使用变量Regexp

时间:2011-07-11 21:58:29

标签: regex flash actionscript-3 flash-cs5

使用Actionscript 3.0(在Flash CS5中)

匹配任何数字的标准正则表达式为:

var myRegexPattern:Regex = /\d/g;

正则表达式将字符串变量合并到匹配中会是什么样的? (这个例子是'IDEAL'而不是'WORKING'片段),即:

var myString:String = "MatchThisText"
var myRegexPatter_WithString:Regex = /\d[myString]/g;

我已经看到了一些解决方法,涉及创建多个正则表达式实例,然后按来源将它们与有问题的变量结合起来,这似乎是错误的。或者使用闪存字符串来创建正则表达式创建者,但它只是简单的草率,需要所有的双重和三重转义序列。

必须有一些我在实时文档或谷歌上找不到的无痛方式。 AS3甚至可以保持此功能吗?如果没有,它确实应该。

或者我错过了一个更简单的方法来简单地避免这个任务,因为我对正则表达式的新意,我也很天真?

2 个答案:

答案 0 :(得分:9)

我实际上是在写博客,所以我只会指出你:http://tyleregeto.com/using-vars-in-regular-expressions-as3它谈到了可能的解决方案,但没有像你提到的那样理想。

修改

以下是该博客条目重要部分的副本:

这是一个从文本块中剥离标记的正则表达式。

/<("[^"]*"|'[^']*'|[^'">])*>/ig

这个漂亮的表达就像一个魅力。但我想更新它,以便开发人员可以限制剥离哪些标记到数组中指定的标记。非常直接的东西,要在正则表达式中使用变量值,首先需要将其构建为字符串然后进行转换。如下所示:

var exp:String = 'start-exp' + someVar + 'more-exp';
var regex:Regexp = new RegExp(exp);

非常直接。因此,当接近这个小升级时,这就是我所做的。当然,一个很大的问题很明显。

var exp:String = '/<' + tag + '("[^"]*"|'[^']*'|[^'">])*>/';

猜猜什么,无效的字符串!最好逃避字符串中的引号。哎呀,这将打破正则表达!我很难过。所以我打开了语言参考,看看我能找到什么。 “源”参数(我之前从未使用过)引起了我的注意。它返回一个描述为“正则表达式的模式部分”的String。它完美地完成了这个技巧。这是解决方案:

var start:Regexp = /])*>/ig;
var complete:RegExp = new RegExp(start.source + tag + end.source);

为方便起见,您可以将其降低到此值:

var complete:RegExp = new RegExp(/])*>/.source + tag, 'ig');

答案 1 :(得分:6)

正如Tyler正确指出的那样(并且他的答案很好),您可以将正则表达式组合为字符串结尾,然后使用RegExp语法将此字符串传递给new RegExp("pattern", "flags")构造函数。

function assembleRegex(myString) {
    var re = new RegExp('\\d' + myString, "i");
    return re;
}

请注意,当使用字符串存储正则表达式模式时,您需要添加一些额外的反斜杠才能使其正常工作(例如,要在正则表达式中获得\d,您需要指定{{1在字符串中)。另请注意,字符串模式不使用正斜杠分隔符。换句话说,以下两个陈述是等价的:

\\d

附加说明:您可能需要处理var re1 = /\d/ig; var re2 = new Regexp("\\d", "ig"); 变量以转义它可能包含的任何反斜杠(如果它们被解释为文字)。如果是这种情况,则函数变为:

myString