正则表达式匹配特殊字符的反转

时间:2014-04-29 20:07:12

标签: regex actionscript-3 flex actionscript

我是RegExp的新手,我尝试在Flex AS3中创建一个RegExp,它匹配我的表达式my_regex中给出的模式之外的任何内容。也就是说,我希望匹配除“^():,?+ * /”之外的所有内容。“ (没有双引号)。但我的程序表现得非常奇怪,它会在替换字符键入时显示错误字符串。请说明我的正则表达式有什么问题。

`

<fx:Script>
    <![CDATA[
        private const my_regex:RegExp = /\b[^():,?+*\.]/g;

        private function validateNow(evt:Event):void {
            if (my_regex.test(ti.text)) {
                ti.errorString = null;
            } else {
                ti.errorString = "some error here";
            }
        }
    ]]>
</fx:Script>

<mx:TextInput id="ti" change="validateNow(event)"/>

`

2 个答案:

答案 0 :(得分:0)

您的if逻辑似乎已被逆转。

摆脱\b,因为它代表“字边界”(此处不需要)。

字符类开头的^(方括号内的内容)否定了它。字符类的任何其他位置的^表示该字面字符(这就是我最后添加一个字符的原因)。

如果您在方法中使用var ti:TextInput = evt.target as TextInput;,则可以将该方法应用于多个不同的TextInputs(为什么使用旧的mx组件,更好地使用spark

这是我的解决方案(第二个TextInput是红色的,因为正则表达式不允许使用空格):

screenshot

这里是代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Script>
        <![CDATA[
            private const my_regex:RegExp = /[^():,?+*\.^]/;

            private function handleChange(evt:Event):void {
                var ti:TextInput = evt.target as TextInput;

                trace("text=" + ti.text);
                trace("test=" + my_regex.test(ti.text) + "\n");

                if (my_regex.test(ti.text)) {
                    ti.errorString = 'Only these chars are allowed: ():,?+*.^';
                } else {
                    ti.errorString = null;
                }
            }
        ]]>
    </fx:Script>

    <s:TextInput id="ti1" change="handleChange(event)"
        horizontalCenter="0" top="50"/>

    <s:TextInput id="ti2" change="handleChange(event)"
        horizontalCenter="0" top="100"/>

    <s:TextInput id="ti3" change="handleChange(event)"
        horizontalCenter="0" top="150"/>
</s:Application>

答案 1 :(得分:-1)

你的正则表达式有几个问题......

首先,你需要逃避许多这些角色,因为它们在正则表达式中具有特殊含义。您可以通过在每个前面添加反斜杠来逃避它们的特殊功能(从而仅指代字符)。老实说,你可以逃脱它们。

编辑:\ b确实在大多数情况下标记了单词边界,但是,这与我们的目的无关。

您修改的正则表达式是......

private const my_regex:RegExp = /[\^\(\)\:\,\?\+\*\\\.]/g;

另一个考虑因素是,如果你运行my_regex.test(ti.text),如果字符串中出现任何这些字符,它将返回true。为了使您的错误字符串在匹配时具有值,您必须反转逻辑。在调用!之前,我使用了not(.test)运算符。

private function validateNow(evt:Event):void {
    if (!my_regex.test(ti.text)) {
       ti.errorString = null;
    } else {
       ti.errorString = "some error here";
    }
}

我强烈建议您方便地使用正则表达式。我个人最喜欢的是The ActionScript 3.0 Bible 2e。第12章详细介绍了详尽的内容。如果您更喜欢网络资源,the AS3 documentation效果很好。