Tenho lutado para obter uma regex que possa capturar dados extraídos de um arquivo PDF não tão limpo:
Cada linha deve conter 1. ID da escola (5 dígitos), 2. nome da escola, 3. número da inscrição, 4. outro número (=número da oferta)
Uma linha limpa se parece com "10394 ABC School 50 34" e pode ser capturada usando ([0-9]{5})\s{2,}(\D+)\s+(\d*)\s+(\d*)
. Um caso normal se parece com https://regex101.com/r/Mwv3bJ/1 , ignore o lookbehind negativo.
O problema com o qual tenho dificuldade é que algumas escolas têm um código postal parcial (1 ou 2 letras do alfabeto seguido de 1 ou 2 dígitos, como W19 ou SW2) no nome , então "10422 XYZ College W9 60 33" será capturado como (id: 10422)(escola: XYZ College W)(inscrições: 9)(ofertas: 60). https://regex101.com/r/YeNmT7/1
Quero que o (3:application#) não capture nenhum dígito imediatamente precedido por um alfabeto e, se tal \D{1,2}\d{1,2} existir no nome, seja capturado por (2:nome da escola). Tentei um grupo sem captura (?:^\D{1,2}\d{1,2}$) para me livrar de qualquer CEP em potencial, mas não funcionou.
Exemplos:
- 18747 Escola ABC 50 14 //(18747)(Escola ABC)(50)(14)
- 17646 Escola EFG W11 190 44 //(17646)(Escola EFG W11)(190)(44)
Por favor, avise.
Você pode usar
Veja esta demonstração . Ou, um pouco mais otimizada:
Veja a demonstração do regex .
Se o número inicial tiver que conter apenas 5 dígitos, adicione um limite de palavra,
\b
.Detalhes :
\b
- um limite de palavra([0-9]{5})
- Grupo 1: cinco dígitos\s{2,}
- dois ou mais caracteres de espaço em branco([^\d\s]\D*(?:\s[a-zA-Z]{1,2}\d{1,2})?)
- Grupo 2:[^\d\s]\D*
- um caractere que não é um dígito e um espaço em branco e então zero ou mais caracteres não-dígitos(?:\s[a-zA-Z]{1,2}\d{1,2})?
- uma sequência opcional de um espaço em branco e depois uma ou duas letras ASCII e depois um ou dois dígitos\s+
- um ou mais espaços em branco(\d+)
- Grupo 3: um ou mais dígitos\s+(\d+)
- um ou mais espaços em branco e então o Grupo 4 capturando um ou mais dígitos.Observe que
[^\d\s]+(?:\s+[^\d\s]+)*
corresponde a um ou mais caracteres diferentes de dígitos e espaços em branco e, em seguida, a uma ou mais repetições de um ou mais espaços em branco seguidos por um ou mais caracteres diferentes de dígitos.Você provavelmente deve evitar o uso
\D+
nessa circunstância.Principalmente se permitir exceções, como dígitos dentro do
\D
guarda-chuva. Em vez disso, use.+?
e crie uma correspondência de forma, mantendo os 4 dígitos + algo + dígitos + dígitos.Se
.+?
for muito amplo, você terá que se dar ao trabalho de definir completamente o que é aceitável.Aqui os Grupos 1, 2, 4, 5 contêm seus dados de extração.
https://regex101.com/r/KDbGl2/1