Estou tentando limpar o título do vídeo do YouTube de palavras desnecessárias como "Vídeo Oficial", "Áudio", "Vídeo Musical" etc. Preciso de ajuda para construir regex que eu possa usar. O que tentei até agora:
const regex = /\s*[-\(\[]?\s*(-|official|video|audio|lyrics|lyric|hd|full|4k|music\s+video|\d{4})\s*[\)\]]?$/gi;
Pelo que entendi, isso removeria apenas a última ocorrência de palavras-chave. O que eu fiz foi usá-lo em um loop como este:
function clearSearchTerm(title) {
const regex = /\s*[-\(\[]?\s*(-|official|video|audio|lyrics|lyric|hd|full|4k|music\s+video|\d{4})\s*[\)\]]?$/gi;
let newTitle;
do {
newTitle = title;
title = title.replace(regex, "");
} while (newTitle !== title);
return title;
}
Agora funciona para mim, pois não encontrei nenhum exemplo em que não funcionasse. O que foi mencionado nos comentários é que eu tinha um problema que meu regex anterior removia palavras-chave se elas aparecessem no meio do título, o que eu acho que foi resolvido com isso. Se você tiver alguma ideia de como isso pode ser melhorado, estou todo ouvidos. Na próxima parte, escreverei exemplos do que preciso remover.
As palavras que estou tentando remover são do tipo:
Audio
Video
Lyrics
Official
Remaster
2020 (or years in general)
...
E todas essas palavras (e talvez mais) podem aparecer entre (
and )
ou between [
and ]
or depois de -
. Essas palavras podem ser combinadas, por exemplo: Some title - Official Video
which should be cleaned to be Some title
etc.
Com PCRE (tipicamente em PHP), você pode evitar a repetição de palavras declarando um subpadrão e então reutilizá-lo mais tarde no padrão principal. Também é possível adicionar comentários e espaços para legibilidade com o sinalizador x :
Veja em ação com a explicação: https://regex101.com/r/kPeYzb/1
Se você tiver que usar o mecanismo do JavaScript, terá que remover os espaços, comentários e copiar e colar o padrão das palavras, resultando no mesmo padrão, no estilo JavaScript:
Em ação aqui: https://regex101.com/r/kPeYzb/2
Agora, sobre sua questão de evitar ter essa lista de palavras inseridas duas vezes no regex, é possível criar o regex a partir de uma string, com o
RegExp()
construtor. Isso significa que você pode ter um array de palavras (ou regexes de palavras) a partir de uma configuração:Esta regex corresponderá
, seguido por qualquer uma das palavras
-
a ou[
ou(
seguido por qualquer número de espaços literaisOFFICIAL VIDEO|REMASTER|LYRICS|AUDIO
ou um número de quatro dígitos, seguido por qualquer número de espaços seguido por um colchete de fechamento correspondente (quando aplicável).PADRÃO REGEX (sabor ECMAScript(JavaScript))(Sinalizadores: gmi):
Demonstração de Regex: https://regex101.com/r/Wy2I0w/8 (10 correspondências)
NOTAS:
(|\[(?:(?<=\[)(?= *[^\]\n]* *\])))
(?:
(?:...)
Abra a instrução de alternância de grupo não capturado(...|...|...)
. Corresponda a um dos elementos na instrução de alternância separados pelo pipe (|
).-
Corresponder traço literal-
( 1ª opção )|
Delimitador de elemento de alternância. Seguido pela 2ª opção.\(
Correspondência literal(
(?:
Iniciar grupo não-capturador(?:...)
( 2ª opção )(?<=
Comece a olhar para trás(?<=...)
para verificar se há abertura(
.\(
Corresponder literal(
. Este caractere deve preceder este ponto de índice.)
Dê uma olhada de perto para trás .(?=
Comece a olhar para frente(?=...)
para ter certeza de que há um fechamento correspondente)
. Não consumirá caracteres.*
Corresponde a 0 ou mais (*
) espaços literais[^)\n]+
A classe de captura negada[^...]
corresponde a qualquer caractere que não seja)
ou nova linha\n
, 1 ou mais vezes (+
).*
Corresponde a 0 ou mais (*
) espaços literais\)
Corresponder literalmente)
.)
Visão antecipada de perto .)
Fechar grupo não-capturador (2ª opção)|
Delimitador de elemento de alternância. Seguido pela 3ª opção.\[
Corresponder literalmente[
.(?:
Iniciar grupo de não captura(?:...)
( 3ª opção )(?<=
Comece a olhar para trás(?<=...)
para verificar se há abertura.\[
Corresponder literalmente[
.)
Feche *olhe para trás.(?=
Comece a procurar à frente para localizar o colchete de fechamento correspondente]
. Não consumirá caracteres.*
Corresponde a 0 ou mais espaços literais[^\]\n]+
Classe de caractere negado Corresponde a qualquer caractere que não seja]
ou nova linha\n
, uma ou mais vezes (+
).*
Corresponde ao espaço literal\]
Corresponder literalmente]
.)
Visão antecipada de perto .)
Feche o grupo que não captura.)
Fechar grupo de alternância.*
Corresponde a 0 ou mais espaços literais(?:
Comece um grupo não capturado contendo uma alternância.OFFICIAL VIDEO|REMASTER|LYRICS|AUDIO|\d{4}
A altenação corresponde a uma das palavras listadas ou quatro dígitos\d{4}
(ano).)
Feche o grupo que não captura.\s*
Corresponde a 0 ou mais caracteres de espaço em branco\s
.(?:
Grupo aberto não capturado contendo alternância.\]|\)
Corresponde a um literal]
ou a um literal)
.)?
Feche o grupo de alternância. Torne-o opcional (?
).(?=
Iniciar lookahead , não consumirá caracteres.|\n|$
Corresponde a um caractere de espaço literal\n
ou fim de linha$
.)
Visão antecipada de perto .CADEIA DE TESTE:
RESULTADO: