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 dayem 3 ou 4 grupos distintos, dependendo se o -caractere está presente na string original ou não:

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

ou

(Um especial de Natal) (Especial) (do dia) se o - char não estiver presente.

O padrão RegEx que estou tentando usar na string se parece com o seguinte: ^(.+?)( - )?(Special)(.*)

Que se traduz em:

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

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

Grupo3: Corresponde aos caracteres Specialliteralmente

Grupo4: Corresponde a qualquer caractere (exceto nova linha) Entre zero e ilimitado vezes, quantas vezes for possível, devolvendo conforme necessário [ganancioso]

O problema com a expressão como está 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 faça parte, de modo que 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 estiver presente.

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

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

KAnders
fonte

Respostas:

-1

Tente com isto:

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

([^-]+[^-\s]) : Corresponde a qualquer sequência que não contenha '-' nem finalize em espaço em branco.

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

(Special)\s?(.*): Corresponde 'Especial + espaço em branco (opcional) + qualquer_cota'

Santiago Santana
fonte
Não tenho certeza de quem votou negativamente no seu comentário, mas parece funcionar bem e é apreciado.
precisa saber é o seguinte
0

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

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

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

http://www.regular-expressions.info/

David Paige
fonte
Agradeço o comentário, mas leia meu post novamente. O primeiro grupo já é preguiçoso, como expliquei no OP.
Kanders