Regex capture group not working as expected

113 Views Asked by At

I am trying to extract a info called "número de controle de cadeira cativa do Maracanã" (Maracanã's captive chair control number) from lawsuits using this regex:

cadeiras?\s*?(perpétua|cativa)?s?\s*?(de|com|,)?\s*?(o)?\s*?(número)?\s*?(de)?\s*?(controle)?\s*?(inicial)?\s*?(de)?\s*?(números?|nº)?\s*?(?<NUMERO_CONTROLE_CADEIRA>\d(\d|\s|-|–)+)\s*?(e)?\s*?\g<NUMERO_CONTROLE_CADEIRA>

The problem is that in cases where two control numbers appears separed by " e " (and in pt-br), even using \g subroutine, the second number is not beign captured:

O Autor é detentor do direito de uso de duas cadeiras perpétuas com o número de controle nº 1234-123456789 e 3421 – 11111111 (Doc. 04) do Estádio

NUMERO_CONTROLE_CADEIRA: 1234-123456789

Not only that, in some cases, the group value is incomplete (the last number is out):

O Autor é detentor do direito de uso de uma cadeira perpétua com o número de controle nº 4321-112223333 (Doc. 07) do Estádio Jornalista Mário Filho

NUMERO_CONTROLE_CADEIRA: 4321-11222333

I have more cases here: https://regex101.com/r/MxTAnZ/1

How can I fix this regex to get correctly these control numbers?

1

There are 1 best solutions below

2
VonC On BEST ANSWER

Assuming there is no more than 1 or 2 number, this regexp would capture both:

(\bcadeiras?\b|\bnúmero\b)\s*(perpétua|cativa)?s?\s*(de|com|,)?\s*(o)?\s*(número)?\s*(de)?\s*(controle)?\s*(inicial)?\s*(de)?\s*(números?|nº)?\s*(?<NUMERO_CONTROLE_CADEIRA>\d[-\d –\.]*\d)( e (números?|nº)?(?<NUMERO_CONTROLE_CADEIRA2>\d[-\d –\.]*\d))?

See https://regex101.com/r/88PFZw/1

Note that you have both in your numbers: