Ajuda montar um RegExMatch Topic is solved

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

Moderator: Gio

Azarfy
Posts: 22
Joined: 25 Mar 2020, 20:21
Facebook: fb.com/azarfy

Ajuda montar um RegExMatch

29 May 2020, 00:27

Boa noite, bom algumas semanas atras estive aqui pedindo ajuda para uma RegEx e deu certo, porem fui tentar colocar ela para ler outra linha e ela não funcionou. Estou apanhando muito e resolvi vim aqui pedir um helper. a linha seria o seguinte

Code: Select all

[01:45:46] [ATENDIMENTO] O jogador [TJS]Will.Zn[UPC](43) esta na fila para ser atendido com a senha 383, use "/atender helper".
Esse é um exemplo da linha eu precisaria que o RegEx pegasse o valor que fica entre parentese no caso o 43, porem a forma que estou fazendo não esta dando o resultado ela esta conseguindo pegar um valor de numero, mas o numero esta sendo o 383 que não é o foco.

O código que estou usando é esse:

Code: Select all

TEXTO_DA_LINHA := "[01:45:46] [ATENDIMENTO] O jogador [TJS]Will.Zn[UPC](43) esta na fila para ser atendido com a senha 383, use ."

PRIMEIRA_OCORRENCIA := RegExMatch(TEXTO_DA_LINHA, "\s\d{1,3}", TEXTO_ENCONTRADO)

MSGBOX % TEXTO_ENCONTRADO
E como disse o resultado não ta sendo o esperado, esta me dando o valor de 383, e eu precisaria do 43. Alguém pode me auxiliar a terminar esse RegEx ?
garry
Posts: 2294
Joined: 22 Dec 2013, 12:50

Re: Ajuda montar um RegExMatch

29 May 2020, 10:09

função do usuário 'SKAN'

Code: Select all

TEXTO_DA_LINHA := "[01:45:46] [ATENDIMENTO] O jogador [TJS]Will.Zn[UPC](43) esta na fila para ser atendido com a senha 383, use ."
A= (  ;- começar
B= )  ;- fim
c:=xStr(TEXTO_DA_LINHA,,A,B,,,,,0,0)   ;- with A and B
d:=xStr(TEXTO_DA_LINHA,,A,B)           ;- between A and B
msgbox,%c%`n--------------------`n%d%
return
;----------------------------------------------------------------
;- SKAN  xStr  for general text extraction and parsing XML  HTML 
;- https://www.autohotkey.com/boards/viewtopic.php?f=6&t=74050
xStr(ByRef H, C:=0, B:="", E:="",ByRef BO:=1, EO:="", BI:=1, EI:=1, BT:="", ET:="") {                           
Local L, LB, LE, P1, P2, Q, N:="", F:=0                 ; xStr v0.97 by SKAN on D1AL/D343 @ tiny.cc/xstr  
Return SubStr(H,!(ErrorLevel:=!((P1:=(L:=StrLen(H))?(LB:=StrLen(B))?(F:=InStr(H,B,C&1,BO,BI))?F+(BT=N?LB
:BT):0:(Q:=(BO=1&&BT>0?BT+1:BO>0?BO:L+BO))>1?Q:1:0)&&(P2:=P1?(LE:=StrLen(E))?(F:=InStr(H,E,C>>1,EO=N?(F
?F+LB:P1):EO,EI))?F+LE-(ET=N?LE:ET):0:EO=N?(ET>0?L-ET+1:L+1):P1+EO:0)>=P1))?P1:L+1,(BO:=Min(P2,L+1))-P1) 
} 
;=======================================
User avatar
Gio
Posts: 981
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda montar um RegExMatch  Topic is solved

29 May 2020, 10:25

Bom dia Azarfy.

Você pode encontrar um guia rápido para a sintaxe de escrita dos parâmetros NeedleRegEx nesta página (Se você estiver usando uma versão recente do Google Chrome, o tradutor pode ajudá-lo).

Com relação ao caso apontado, a NeedleRegEx que você postou (\s\d{1,3}) basicamente está procurando o seguinte padrão:

Um espaço (\s), seguido de 1 a 3 dígitos numéricos (\d{1,3}). Este padrão será sempre procurado da esquerda para direita do texto.

:arrow: O padrão que você procura não é este. Ele é mais como: um parêntesis de abertura (, seguido de dois a cinco números, seguido de um parêntesis de fechamento ).

Tipo assim:

Code: Select all

PRIMEIRA_OCORRENCIA := RegExMatch(TEXTO_DA_LINHA, "\(\d{1,5}\)", TEXTO_ENCONTRADO)

:arrow: É importante lembrar que o RegEx vai pegar sempre a primeira ocorrência da esquerda para a direita do texto. Se houver qualquer possibilidade do texto conter outro padrão que se encaixe na descrição, você terá que eliminar isso do texto antes (eu mostrei como fazer isso no outro tópico).

Se ainda tiver alguma dúvida, basta postar abaixo :thumbup:
Azarfy
Posts: 22
Joined: 25 Mar 2020, 20:21
Facebook: fb.com/azarfy

Re: Ajuda montar um RegExMatch

29 May 2020, 11:16

Muito obrigado novamente por me ajudar, e outra coisa, eu consigo remover o parenteses da minha resposta ?

No caso deu super certo apontou o (43), mas eu precisaria apenas do digito, é uma duvida muito recorrente minha, mas existe alguma forma de se conseguir isso ? De deixar apenas o Digito 43 ?
User avatar
Gio
Posts: 981
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Ajuda montar um RegExMatch

29 May 2020, 11:49

Você precisa entender os comandos de tratamento de dados em texto e como criar algoritmos unindo vários desses comandos em sequência.

Eu fiz um tutorial sobre isso algum tempo atrás e você pode encontrá-lo aqui.

Essa sua pergunta é bastante simples de responder, mas não deixe de procurar entender os comandos, do contrário vai ficar tendo essa mesma dúvida sempre que precisar tirar dados de textos.

Analise o texto que você quer trabalhar e vai perceber que:

1. Você quer remover os parêntesis.
2. O parêntesis de abertura ( é sempre o primeiro caractere do texto (ou seja, o caractere mais à esquerda).
3. O parêntesis de fechamento ) é sempre o último caractere do texto (ou seja, o caractere mais à direita).

As características 2 e 3 nós podemos ter certeza que sempre serão assim pois foi assim que configuramos o comando RegExMatch(). Logo, ele não pode pegar nada que não tenha essas características.

Você pode remover um número de caracteres desejado iniciando da esquerda do texto com o comando StringTrimLeft.
Da mesma forma, pode remover um número de caraceteres iniciando da direita do texto com o comando StringTrimRight.

Dessa forma pode montar um algoritmo bem simples tipo esse abaixo:

Code: Select all

VAR := "(43)"
msgbox, %VAR%
StringTrimLeft, VAR, VAR, 1
StringTrimRight, VAR, VAR, 1
msgbox, %VAR%

:arrow: Veja que no código acima, conseguimos remover os parêntesis facilmente do conteúdo da variável VAR facilmente.
Azarfy
Posts: 22
Joined: 25 Mar 2020, 20:21
Facebook: fb.com/azarfy

Re: Ajuda montar um RegExMatch

29 May 2020, 12:13

Muito obrigado Gio agora entendi como Remover o procurado !!

Realmente era algo que tinha muita duvida e estava usando uns método muito nada haver e claro não teve resultado.

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 4 guests