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

pho3nix

Regex expression - preciso de ajuda

Recommended Posts

pho3nix

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.

Share this post


Link to post
Share on other sites
pedrotuga

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.

Share this post


Link to post
Share on other sites
pedrotuga

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

---

---,

Share this post


Link to post
Share on other sites
Njay

\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...


Blog: Tróniquices ~ Projecto: EmbeddedDreams.com

Share this post


Link to post
Share on other sites
JoaoRodrigues

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

Share this post


Link to post
Share on other sites
pho3nix

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...

Share this post


Link to post
Share on other sites
djthyrax

A-AsadasdASD123123123-123123-,

AAsadasdASD123123123-123123-

AAsadasdASD123123123-123123

AA-sadasdASD123123123123123

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


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
pedrotuga

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.

Share this post


Link to post
Share on other sites
Njay

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).


Blog: Tróniquices ~ Projecto: EmbeddedDreams.com

Share this post


Link to post
Share on other sites
slack_guy
$ 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
----------------------------------------------------------------------


:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp :quitplease :quitnow :leave ^X^C ^C ^D ^Z ^Q QUITDAMMIT

Share this post


Link to post
Share on other sites
pedrotuga

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.