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>