Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to set the precedence of capturing groups

I want 3 capturing groups (pre/mid/post) that share some characters. All three can match 0 or 1 time, something like this:

^(?<pre>[T])?(?<mid>[T][A-Z])?(?<post>[T])?$

I am looking for them to match in order: mid -> pre -> post. Regex I've posted works for 3/4 letter strings, like TTT / TTU / TUT. For two character string TT, I would like for group mid to be matched - the result is pre: T, post: T though. I understand why that's happening - pre matches, mid doesn't find two character to match, post matches.

For mid to take precedence I've tried combinations of groups and lazy operators, but most of them resulted in post matching before pre, like for this example:

^(?<pre>[T])??(?<mid>[T][A-Z])?(?<post>[T])?$

Is there any way to allow mid group to match before pre? Can you set some kind of order of matching?

like image 285
rybaczewa Avatar asked Oct 26 '25 08:10

rybaczewa


1 Answers

I don't think you need any lazy operators - just explicitly group pre together with mid, so that if pre matches then mid is required:

^(?:(?<pre>T)?(?<mid>T[A-Z]))?(?<post>T)?$

(online demo)

Or rather, I think you want to require mid to match together with an optional post, so that a single T input is matched by pre only:

^(?<pre>T)?(?:(?<mid>T[A-Z])(?<post>T)?)?$

(online demo)

like image 75
Bergi Avatar answered Oct 28 '25 22:10

Bergi



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!