I have a textarea with a simple FormControl, which I'd like to validate via the Validators.pattern() method. None of the new lines should be started with a ? or *. That's all the requirements.
I've tried the following:
control = new FormControl('', Validators.pattern(/^(\?|\*)$/));
With this, I can validate the first line (works well if the line starts with a special character), but as soon as I hit enter my FormControl will be invalid.
How should I tweak the regex to meet the requirements?
Since you are dealing with a textarea you need to emulate the \A meta escape which is "start of string not line"
/(?<!\s)^(?![\s\S]*^[?*])/gm
(?<!\s)^ - detect the start of the string(?![\s\S]*^[?*]) - Ahead of me cannot be any line which starts with a question mark nor asterisk
[\s\S]* - capture everything, even new lines^[?*] - detect a line which starts with a question mark or asteriskYou can use
// With a string literal where anchors are added automatically by Angular
control = new FormControl('', Validators.pattern('(?![?*]).*(?:[\r\n]+(?![?*]).*)*'));
// Or, with a regex literal
control = new FormControl('', Validators.pattern(/^(?![?*]).*(?:[\r\n]+(?![?*]).*)*$/));
See the regex demo. Details:
^ - string start anchor(?![?*]) - no ? and * are allowed immediately to the right of the current location.* - zero or more chars other than line break chars as many as possible(?: - start of a non-capturing group:
[\r\n]+ - one or more CR / LF chars (carriage return or line feed chars)(?![?*]).* - a line that does not start with ? nor *)* - end of group, zero or more occurrences$ - end of the string.