RegExpValidator.expressionの設定方法ではまった。

事象

IPv4アドレスにマッチする正規表現 "^(?:\d{1,3}\.){3}\d{1,3}$" をRegExpValidator.expressionに設定して検証しようとしたが、常に検証失敗となる。

対象の正規表現Flex 3 Regular Expression Explorer(http://ryanswanson.com/regexp/#start)に入れたら正しくマッチできてるのになんで?

原因

new コンストラクタによる正規表現の定義の中で、円記号(\)から始まるメタシーケンス(任意の数字を意味する \d など)を使用する場合は、円記号を二重に入力する必要があります

Flex デベロッパーセンター | Adobe Developer Connection [ADC]

RegExpValidatorは内部でRegExpインスタンスを生成して検証しているため、expressionにメタシーケンスを設定する場合も円記号を二重に入力する必要がある。

FlexUnit4のテストクラス

package tmftake {

    import mx.events.ValidationResultEvent;
    import mx.validators.RegExpValidator;

    import org.flexunit.Assert;

    public class RegExpValidatorTest {
        /**
         * 検証メソッド
         *
         */
        [Test]
        public function testValidate():void {
            //期待値を設定
            var passThroughData:Object = {};
            passThroughData.eventType = "valid";

            //テスト条件設定
            passThroughData.required = true;
            //NG
            //passThroughData.expression = "^(?:\d{1,3}\.){3}\d{1,3}$";
            //OK
            passThroughData.expression = "^(?:\\d{1,3}\.){3}\\d{1,3}$";
            passThroughData.text = "192.168.1.1";

            var validator:RegExpValidator = new RegExpValidator();
            validator.required = passThroughData.required;
            validator.expression = passThroughData.expression;
            var event:ValidationResultEvent =
validator.validate(passThroughData.text);

            //検証
            Assert.assertEquals(passThroughData.eventType, event.type);
        }
    }
}

NGの場合の結果

tmftake::RegExpValidatorTest.testValidate_01 expected:<valid> but
was:<invalid>