I'm having a problem validating an IPv4 form field using Angular2 reactive forms.
I define the form field like this:
this.formModel.addControl('address', new FormControl('', this.ipAddressValidator.bind(this)));
The validator function is:
ipAddressValidator(control: FormControl): {[key: string]: any} {
const value: string = control.value || '';
let valid;
let ipVersion : string;
if(this.formModel.controls['ip_version'])
ipVersion = this.formModel.controls['ip_version'].value;
if(ipVersion == 'IPv6')
valid = value.match(this.ipV6Regexp);
else
valid = value.match(this.ipV4Regexp); // By default, consider the address as IP V4
return valid ? null : { ip: true };
}
Basically, it checks the value of an HTML select tag ('ip_version') and sets the regular expression to either IPv4 or IPv6. The variable that holds the IPv4 regular expression is 'this.ipV4Regexp', and its value is:
public ipV4Regexp : string =
"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
The problem is that the form accepts values as '192.168' or '192.168.10', when the regular expression specifies clearly to accept only {3} blocks of numbers, followed by a last one. If I go to test the expression to https://regex101.com/, it works fine and only accepts addresses with 4 blocks of numbers.
Isn't the regular expression right? Thanks,