Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple Conditions in Validation Regex

I am more or less a regex novice. I tried to get the following conditions into a regex:

  • No White Space at the beginning and at the end of a string
  • Allow all digits
  • Allow spaces, points, brackets, plus and minus

Resulted in the following regex:

^\S[\d\/. ()\-+]*\S$

But now I try to apply two more conditions:

  • Allow only one or two +
  • Allow only one ( and one )

My problem is how to merge those two conditions into the existing regex string above, as excluding + [+]{1,2} and () [(]{1} [)]{1} doesn't make much sense because I'm trying to make general statements in no particular order so that I would be able to chain it.

like image 942
rkoller Avatar asked Sep 16 '26 02:09

rkoller


1 Answers

Use this:

^(?=\S)(?=(?:[^+]*\+){0,2}[^+]*$)(?=(?:[^(]*\()?[^(]*$)(?=(?:[^)]*\))?[^)]*$)[- .()+0-9]*[-.+()0-9]$

In the regex demo you can play with the input to check what matches and doesn't.

Explanation

  • The ^ anchor asserts that we are at the beginning of the string
  • The lookahead (?=\S) asserts that what follows is a non-space character
  • Lookahead (?=(?:[^+]*\+){0,2}[^+]*$) : two + chars at the most
  • Lookahead (?=(?:[^(]*\()?[^(]*$) : One ( at the most
  • Lookahead (?=(?:[^)]*\))?[^)]*$) : One ) at the most
  • [- .()+0-9]* zero or more of the allowed chars
  • [-.+()0-9] end with one of the allowed chars that is not a space
  • The $ anchor asserts that we are at the end of the string

Reference

  • Lookahead and Lookbehind Zero-Length Assertions
  • Mastering Lookahead and Lookbehind
like image 100
zx81 Avatar answered Sep 18 '26 15:09

zx81



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!