Regex puzzle, limit optional first character to one of two values
I am working up a regex that will match if the first character is 'S', 'U', or absent. I've gotten it to match the two characters just fine, but I can't figure out how to match the absent character. Here's what I have so far.
- String a = 'S02-1234'; String b = 'T02-1234'; String c = 'U02-1234'; String d = '02-1234'; Pattern regex = Pattern.compile('([U|S])02-1234'); Matcher ma = regex.matcher(a); system.debug('S02-1234 ' + ma.matches()); Matcher mb = regex.matcher(b); system.debug('T02-1234 ' + mb.matches()); Matcher mc = regex.matcher(c); system.debug('U02-1234 ' + mc.matches()); Matcher md = regex.matcher(d); system.debug('02-1234 ' + md.matches());
String a match, GOOD! String b does not match, GOOD! String c matches, GOOD! String d does not match, NOT good! :( I've googled the question quite a bit, and suspect that I might not be using the right keyword. I'll bet it's something simple too... I just can't find it.
You're just missing the ?, which s why you are facing regex optional character:
Pattern regex = Pattern.compile('([U|S])?02-1234');
Note that technically, using [], you don't want the | "operator", because you're actually checking if the string starts with U, S, or |. Similarly, you don't need the (), because it's not necessary here.
Pattern regex = Pattern.compile('[US]?02-1234');
[] is a "character class", which means "allow any one of the values in the bracket". You might want to read more about how regular expressions work; most people like to link to Regular Expressions to learn more about how to build proper regular expressions, and you can search on your favorite search engines for JavaScript-based sites that let you put in a pattern and a string to test.