Eu escrevi um regex para buscar a string do HTML, mas parece que o sinalizador de múltiplas linhas não funciona.
Esse é o meu padrão e quero inserir o texto na h1
tag.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
Eu criei uma string para testá-lo. Quando a cadeia contém "\ n", o resultado é sempre nulo. Se eu removi todos os "\ n" s, obtive o resultado certo, independentemente de com ou sem o /m
sinalizador.
O que há de errado com meu regex?
javascript
regex
Peter Mortensen
fonte
fonte
dotAll
modificador para que você possa fazer/.../s
e seus pontos também corresponderão a novas linhas. Em julho de 2017, estava atrás de uma bandeira no Chrome.Respostas:
Você está procurando o
/.../s
modificador, também conhecido como modificador dotall . Força o ponto.
a também corresponder às novas linhas, o que não ocorre por padrão.A má notícia é que ele
não existe no JavaScript(existe noES2018, veja abaixo) . A boa notícia é que você pode contornar isso usando uma classe de personagem (por exemplo\s
) e sua negação (\S
) juntas, assim:Portanto, no seu caso, a regex se tornaria:
A partir do ES2018, o JavaScript suporta o
s
sinalizador (dotAll); portanto, em um ambiente moderno, sua expressão regular pode ser como você o escreveu, mas com ums
sinalizador no final (em vez dem
;m
muda como^
e$
funciona, não.
):fonte
.
, mas corresponder espaço em branco também (\s
) significa que corresponde\n
(o que.
não ocorre no JavaScript ou pode ser feito com as
sinalização).[^]
também funciona para corresponder a qualquer caractere, incluindo novas linhas, em JavaScript. Veja developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…*?
quantificador em vez de*
para evitar a ganância. Isso evitará pegar o último <h1> do documento: provavelmente não é o que você deseja e não é eficiente, pois o regexp continuará procurando <h1> até o final da string, mesmo que já o tenha encontrado antes.Você quer o
s
modificador (dotall), que aparentemente não existe em Javascript - você pode substituir.
por [\ s \ S], como sugerido por @molf. Om
modificador (multilinha) cria ^ e $ linhas de correspondência em vez de toda a cadeia.fonte
s
bandeira (ES2018). :-)[\s\S]
não funcionou para mim no nodejs 6.11.3. Com base na documentação do RegExp , ele diz para usar o[^]
que funciona para mim.Por exemplo:
/This is on line 1[^]*?This is on line 3/m
onde o *? é a captura não gananciosa de 0 ou mais ocorrências de [^].
fonte
[^]
significa: é como uma dupla negação: "corresponde a qualquer caractere que não esteja nesta lista vazia " e, portanto, resume-se a dizer "corresponde a qualquer caractere" .O modificador dotall chegou ao JavaScript em junho de 2018, ou seja, ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
fonte
Minha sugestão é que é melhor dividir a sequência de várias linhas com "\ n" e concatenar as divisões da sequência original e tornar-se uma única linha e fácil de manipular.
fonte