RegEx está combinando caracteres antes que eu queira

2

Eu preciso analisar uma string que se parece com isso: A Christmas Special - Special of the day em 3 ou 4 grupos distintos, dependendo se o caractere - está presente na string original ou não, como:

(Especial de Natal) (-) (Especial) (do dia) se o - char estiver presente.

ou

(Especial de Natal) (Especial) (do dia) se o - char não estava presente.

O padrão RegEx que estou tentando usar na string é semelhante a: ^(.+?)( - )?(Special)(.*)

Que se traduz em:

Grupo1 = Corresponde a qualquer caractere (exceto a nova linha) Entre um e ilimitado, o menor número de vezes possível, expandindo conforme necessário [lento]

Grupo2 = Corresponde - literalmente. Entre zero e uma vez, quantas vezes for possível, devolvendo conforme necessário [ganancioso]

Grupo3: corresponde aos caracteres Special literalmente

Grupo 4: Corresponde a qualquer caractere (exceto a nova linha) Entre zero e ilimitado, tantas vezes quanto possível, devolvendo conforme necessário [ganancioso]

O problema com a expressão agora é que, como o caractere - é opcional, a primeira ocorrência da palavra Special é tratada como parte de um grupo diferente do que eu quero que seja parte de então os grupos resultantes se parecem com isso.

(Um Natal) (Especial) (- Especial do dia) se o - char estava presente.

ou

(Um Natal) (Especial) (Especial do dia) se o - char não estava presente.

O que não corresponde a nenhum dos padrões de agrupamento que estou tentando obter da string, então a pergunta é óbvia, ou seja,

Como eu altero o padrão regex para que ele não trate a primeira ocorrência da palavra Special como seu próprio grupo exclusivo, mas torne a segunda ocorrência única para que eu possa obter o agrupamento que eu esperava?

    
por KAnders 14.09.2014 / 21:53

2 respostas

-1

Tente com isso:

^([^-]+[^-\s])\s?( - )?(Special)\s?(.*)

([^-]+[^-\s]) : corresponde a qualquer string que não contenha '-' nem finalize no espaço em branco.

\s?( - )? : corresponde a um espaço em branco ou '-'

(Special)\s?(.*) : Especial de Correspondências + espaço em branco (opcional) + any_string '

    
por 15.09.2014 / 00:33
0

O Regex é ganancioso por padrão e para na primeira partida. Para tornar o jogo preguiçoso, você pode usar um? caractere após o termo de pesquisa. Por exemplo,

[. +] é ganancioso, mas [. +?] é preguiçoso.

Este site é um fantástico repositório de informações de expressões regulares.

link

    
por 14.09.2014 / 23:58

Tags