• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pho3nix

Regex expression - preciso de ajuda

15 mensagens neste tópico

Caros amigos precisava de obter um resultado válido para este regex

\s*([\w-]+?)\s*(,|$)

Alguem me pode ajudar já dei voltas e voltas e n chego la. Se alguem souber p.f.f ajude-me a chegar a uma concluão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que aí está é isto:

zero ou mais espaços, seguidos de caracteres não alfanuméricos e dashes (isto é redundante) um ou mais vezes em modo não-greedy, segido de zero ou mais espaços seguido de uma vírgula ou um síbolo de dolar.

Penso que não me enganei em nada.

Há que ter em conta que há mais do que um tipo de REGEXs, há as PCRE, as POSIX e as chamadas 'shell regex'. Estas últimas são as mais limitadas mas tambem mais simples de usar. As duas primeiras são parecidas, pelo que se deve estar ciente de qual se está a usar para evitar confusões, as PCRE são as mais usadas.

Para acabar com todas as dúvidas sobre regex, há estes dois documentos esotéricos:

http://perldoc.perl.org/perlre.html

http://perldoc.perl.org/perlretut.html

são leituras mais ou menos extensas mas valem bem a pena pois deixam qualquer pessoa com um bom domínio de REGEX.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso para mim é mandarim podes me dar um exemplo valido se n for pedir muito. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse $ não está escapado nem precede nenhum caractero normal, pelo que essa expressão regular não me parece válida.

Isso é uma expressão demasiado complicada para um principiante. Sem leres a documentação não te safas.

Joao rodrigues,

sim, mas o \W significa caracteres não alfanuméricos, esse w parecia-me maiusculo, mas realmente é minusculo :S

Assim sendo...

([\w-]+?) passa a significar palavras com caracteres alfanuméricos e com dashes, sendo que uma string vazia tambem valida.

Posto isfo ficamos apenas com os espaços e a última parte.

Acho que esta regex serve para separar que não tenha números e outros caracteres esquisitos e que seja delimitado por vírgulas ou por newlines. Se bem que a última parte tem um aspecto bem esquisito assim com o dolar atirado prali à bruta. Mas iso já é capaz de ser eu que não o sei usar em todo o seu explendor.

Coisas que isso valida serão nesse caso:

blabla

blabla,

bla-a

---

---,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

\s*([\w-]+?)\s*(,|$)

\s* -> Qualquer número de caracteres brancos, incluindo nenhum

[\w-] -> O \w que eu conheço pode ser qualquer caracter alfanumérico, mas isto pode depender do interpretador; já ter [] a terminar com um hífen nunca vi... se fosse [-\w] isso já era qualquer caracter alfanumérico ou o hífen.

+? -> uma ou mais ocorrências de [\w-], versão "non-greedy".

(,|$) -> Talvez uma virgula ou $, se bem que geralmente o $ indica "fim da string"

Em que "sitio" viste essa expressão? Em TCL ela faz match com quase tudo.

Também acho essa expressão um pouco estranha, mas como há tanta coisa que eu desconheço...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, um hijack ao tópico :x Qual a diferença prática entre greedy e não greedy?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes me dar um exemplo pratico de um resultado? é que tenho meu código pendurado por causa disso.

Este regex foi um codigo que o cliente me enviou para validar as passwords dos documentos. So que foi feito por outra empresa e eles n fornecem o codigo do match da regex.

enfim

\s*([\w-]+?)\s*(,|$)

\s* -> Qualquer número de caracteres brancos, incluindo nenhum

[\w-] -> O \w que eu conheço pode ser qualquer caracter alfanumérico, mas isto pode depender do interpretador; já ter [] a terminar com um hífen nunca vi... se fosse [-\w] isso já era qualquer caracter alfanumérico ou o hífen.

+? -> uma ou mais ocorrências de [\w-], versão "non-greedy".

(,|$) -> Talvez uma virgula ou $, se bem que geralmente o $ indica "fim da string"

Em que "sitio" viste essa expressão? Em TCL ela faz match com quase tudo.

Também acho essa expressão um pouco estranha, mas como há tanta coisa que eu desconheço...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A-AsadasdASD123123123-123123-,

AAsadasdASD123123123-123123-

AAsadasdASD123123123-123123

AA-sadasdASD123123123123123

Isto tudo é capaz de matchar, digo eu...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

joão, greedy apanha o máximo que puder, não greedy pára assim que o match for satisfeito.

Njay, os parentesis rectos definem uma classe de caracteres, nesse caso a classe é composta por caracteres alfanuméricos e dashes.

Adicionalmente aos do tirácio, este por exemplo tambem é válido:

A-AsadasdASD123123123-123123- ,

e outros com espaços no início ou no fim que não dá para ver muito bem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, um hijack ao tópico :x Qual a diferença prática entre greedy e não greedy?

A versão "normal", que é "greedy", faz match com a maior quantidade possível de simbolos. A versão non-greedy pára assim que encontrar uma cadeia de simbolos que faz match com a expressão. Tomando como exemplo a string "aaab":

a+ faz match de "aaa"

a+? faz match de "a", pois é a 1ª sub-cadeia que satisfaz a expressão.

Quanto à expressão original, \s*([\w-]+?)\s*(,|$), faz match com quase tudo, excepto quando a cadeia termina com simbolos que não sejam o hífen ou a virgula e que não comecem por um digito alfanumerico, hífen ou underscore:

"era uma vez" -> satisfaz a expressão regular

"era uma vez-" -> satisfaz

"era uma vez." -> não satisfaz

"era uma vez@" -> não satisfaz

"era uma vez," -> satisfaz

"    dirtt 9drlk c_rk -lktgtj" -> satisfaz

"_" -> satisfaz

",_" -> satisfaz

"," -> não satisfaz

Pelo menos no regexp do TCL é assim.

De qualquer forma eu faria o seguinte: tentava obter da outra empresa qual é a sintaxe de expressões regulares usada nessa expressão, com a justificação de que existem vários dialectos e tu não és obviamente adivinho. Se eles não te quiserem facultar essa informação (não vejo razão para tal comportamento) então vais fazer "queixinhas" ao teu cliente a dizer que tás bloqueado por causa de uma informação que não te querem dar.

Njay, os parentesis rectos definem uma classe de caracteres, nesse caso a classe é composta por caracteres alfanuméricos e dashes.

Eu sei, mas nas sintaxes que conheço, quando queres usar o hífen dentro da cadeia tens que o colocar no inicio, logo a seguir ao [, caso contrário estarias a definir um intervalo de caracteres. No entanto o TCL papa isso (hífen no final mas sem mais caracteres a seguir), portanto de alguma forma essa sintaxe é suportada (confesso que não tenho pachorra para ir ler essa secção o manual agora).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
$ perl -MYAPE::Regex::Explain -e '$REx=qr/\s*([\w-]+?)\s*(,|$)/; print YAPE::Regex::Explain->new($REx)->explain'
The regular expression:

(?-imsx:\s*([\w-]+?)\s*(,|$))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [\w-]+?                  any character of: word characters (a-z,
                             A-Z, 0-9, _), '-' (1 or more times
                             (matching the least amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  \s*                      whitespace (\n, \r, \t, \f, and " ") (0 or
                           more times (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \2:
----------------------------------------------------------------------
    ,                        ','
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
----------------------------------------------------------------------
  )                        end of \2
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu bem que tinha lido no manual sobre esse módulo mas nunca me dei ao trabalho de o usar. Mas agora é de facto útil.

E vou já meter isso num scriptzinho para a qualquer altura escrever apenas tipo

rexplain.pl "(?-imsx:\s*([\w-]+?)\s*(,|$))"

O $ sempre pode ser usado em alternancia com outro caracter, nem nunca me tinha passado pela cabeça esse uso do dolar, de facto estas regexs são qq coisa de muito poderoso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora