Regex Second Match Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Regex Second Match

03 Feb 2022, 06:22

Olá, bom dia.
Como o proprio titulo diz, gostaria de alguma maneira de conseguir dar match com regex no segundo localizado.

Exemplo:

Code: Select all

<RazaoSocial>Fulano</RazaoSocial><RazaoSocial>Siclano</RazaoSocial>
Ao utilizar

Code: Select all

<RazaoSocial>\K(.*?)<\/RazaoSocial>
Consigo sempre retornar o primeiro, porém gostaria de retornar o segundo, grato!
sofista
Posts: 654
Joined: 24 Feb 2020, 13:59
Location: Buenos Aires

Re: Regex Second Match

03 Feb 2022, 09:13

Proba:

Code: Select all

str := "<RazaoSocial>Fulano</RazaoSocial><RazaoSocial>Siclano</RazaoSocial>"

RegExMatch(str, "^<RazaoSocial>(.*?)</RazaoSocial>\K(.*?</RazaoSocial>)", m)
MsgBox, % m    ; Output: "<RazaoSocial>Siclano</RazaoSocial>"
Saludos
User avatar
Gio
Posts: 1248
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Regex Second Match  Topic is solved

03 Feb 2022, 09:40

Outra possibilidade que funcionaria para encontrar qualquer ocorrência (primeira, segunda, terceira, etc) é simplesmente cortar do texto original as várias strings antes-localizadas a partir da posição encontrada em cada chamada e depois repetir a busca desejada. Isso pode ser feito em um loop.

Por exemplo, para encontrar a terceira ocorrência você poderia fazer assim:

Code: Select all

str := "<RazaoSocial>Fulano</RazaoSocial><RazaoSocial>Siclano</RazaoSocial><RazaoSocial>Beltrano</RazaoSocial>"

Loop 3
{
Posicao := RegExMatch(str, "<RazaoSocial>\K(.*?)(?=<\/RazaoSocial>)", m) ; No RegEx (?=<\/RazaoSocial>) é uma asserção look-ahead que significa que deve existir <\/RazaoSocial> após o padrão, mas que isso não deve vir na resposta.
Remover := Posicao + 5 ; Removemos todos os caracteres até a última posição encontrada E TAMBÉM alguns após ela (5 é só um exemplo), justamente para que a próxima busca não encontre o mesmo padrão. Tome apenas o cuidado de nunca remover mais caracteres do que a string que deve ser localizada possui (pois correria o risco de cortar parte da próxima ocorrência).
StringTrimLeft, str, str, %Posicao%
; msgbox % str ; Descomente esta linha caso queira ver o trabalho de corte no texto após cada passo do loop.
}

msgbox % m

:arrow: Veja que se você mudar o número do loop acima para 1, vai encontrar a primeira ocorrência (Fulano) e se mudar para 2, vai encontrar a segunda (Ciclano).
:arrow: Perceba também que se você quiser manter o texto original após isolar a informação também será muito fácil: basta realizar uma cópia dele no início em outra variável e trabalhar os cortes/regEx apenas na variável-cópia.
thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Regex Second Match

03 Feb 2022, 16:00

Obrigado a todos, consegui entender um pouco melhor de regex com esses exemplos.
Grato!

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 13 guests