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:
(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 Special
literalmente
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?
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/
fonte