Expressões regulares - combinam com qualquer coisa


279

Como faço para fazer uma expressão corresponder a absolutamente qualquer coisa (incluindo espaços em branco)?
Exemplo:

Regex: Eu comprei _____ ovelha.

Correspondências: comprei ovelhas. Eu comprei uma ovelha. Eu comprei cinco ovelhas.

Eu tentei usar (.*), mas isso não parece estar funcionando.

Atualização: eu consegui funcionar, aparentemente o problema não estava nas expressões regulares, é só que os caracteres (.) Estavam escapando.


27
.*Deveria trabalhar. Você pode colar seu código real?
27611 Jacob Eggers

2
Em que idioma você está codificando?
Ziggy

9
um ponto não corresponde a uma nova linha
zee

Respostas:


294

Normalmente, o ponto corresponde a qualquer caractere, exceto novas linhas .

Portanto, se .*não estiver funcionando, defina a opção "ponto também corresponde a novas linhas" (ou use (?s).*).

Se você estiver usando JavaScript, que não possui a opção "dotall", tente [\s\S]*. Isso significa "corresponder a qualquer número de caracteres que sejam espaços em branco ou não em branco" - efetivamente "corresponder a qualquer sequência".

Outra opção que funciona apenas para JavaScript (e não é reconhecida por nenhum outro sabor de regex) é [^]*que também corresponde a qualquer sequência. Mas [\s\S]*parece ser mais amplamente utilizado, talvez porque seja mais portátil.


7
.*não corresponde, \nmas usina uma string que contém apenas \nporque corresponde a 0 caractere.
Toto

1
se estiver usando Javascript, não se esqueça de cortar a barra ao definir uma variável para esse padrão, por exemplo: var pattern = "[\\ s \\ S] *";
Astra Bear

as (?s).*obras para me combinado tudo, incluindo nova linha
Gujarat Santana

1
Existe um problema ao usar / [\ s \ S] * /. Se você usá-lo em seu código e comentar um código que causa um erro de sintaxe, porque o final do padrão significa o final do comentário. Você precisa remover esse padrão do código comentado para fazê-lo funcionar. Mas se você des-comentar novamente, ele não funcionará mais, ou não funcionará como costumava e deveria.
Panu Logic

Esse seria o caso de qualquer regex terminando em um asterisco. É claro que é fácil evitar adicionando algo depois *(como em /.*(?:)/) ou usando o construtor regex ( var foo = new RegExp(".*")).
Tim Pietzcker

177

(.*?) corresponde a qualquer coisa - eu tenho usado por anos.


61
mas isso corresponde a uma nova linha?
ineedahero

Eu usei isso no Sublime Text e funcionou perfeitamente. Obrigado! ("title":".*?")
SCabralO

8
Em Javascript, use [\s\S]*ou [^]*.
Jeff Huijsmans 21/03/19

Não sei, mas toda vez que uso essa expressão, me sinto culpado por não fazer uma expressão específica para o meu caso de uso. Se dizer, w+não é suficiente, acabo usando .+. Felizmente ainda não voltou para me morder.
Tushar #

Funciona para mim usando Python
suffa

90

Escolha e memorize um dos seguintes !!! :)

[\s\S]*
[\w\W]*
[\d\D]*

Explicação:

\s: espaço em branco \S: não espaço em branco

\w: palavra \W: não palavra

\d: dígito \D: não dígito

(Você pode trocar *por +se quiser 1 ou mais caracteres [em vez de 0 ou mais]).




EDIÇÃO DE BÔNUS:

Se você deseja combinar tudo em uma única linha, pode usar o seguinte:

[^\n]+

Explicação:

^: não

\n: quebra de linha

+: para 1 caractere ou mais




4

Porque .Encontre um único caractere, exceto nova linha ou terminador de linha.

Então, para combinar com qualquer coisa, você pode usar assim: (.|\n)*?

Espero que ajude!


2

(.*?)Nao funciona para mim. Estou tentando corresponder aos comentários cercados por /* */, que podem conter várias linhas.

Tente o seguinte:

([a]|[^a])

Este regex corresponde a aou anything else expect a. Absolutamente, significa combinar tudo.

BTW, na minha situação, /\*([a]|[^a])*/corresponde aos comentários no estilo C.

Obrigado @mpen por uma maneira mais concisa.

[\s\S]

1
A maneira mais comum de fazer isso no JS é [\s\S]- ou seja, combinar espaços e não espaços.
MPEN

2

Para JavaScript, a resposta melhor e mais simples parece ser /.*/.

Conforme sugerido por outros, /(.*?)/ também funcionaria, mas /.*/ é mais simples. O () dentro do padrão não é necessário, até onde eu vejo nem o final? para corresponder absolutamente a qualquer coisa (incluindo cadeias vazias)

NÃO SOLUÇÕES:

/ [\ s \ S] / NÃO corresponde a cadeias vazias, portanto não é a solução.

/ [\ s \ S] * / DOES também corresponde a cadeias vazias. Mas há um problema: se você usá-lo em seu código, não poderá comentar esse código porque o '* /' é interpretado como final de comentário.

/ ([\ s \ S] *) / funciona e não tem o problema do comentário. Mas é mais longo e mais complicado de entender do que /.*/.


Entre. parece que os trechos de código acima fazem o Stack Overflow renderizar partes da minha resposta em itálico, que não era minha intenção.
Panu Logic

1

Se você estiver usando JavaScript, o ES2018 adicionou o sinalizador s (dotAll). Com o ssinalizador, o ponto .corresponderá a qualquer caractere, incluindo novas linhas.

console.log("line_1\nline_2".match(/.+/s))

Nota : ainda não é suportado em alguns navegadores.


1

A especificação 2018 fornece o sinalizador s (alias: dotAll), para que .corresponda a qualquer caractere, incluindo quebras de linha:

const regExAll = /.*/s; //notice the 's'

let str = `
Everything
	in 	this
			string
					will
						be
	matched. Including whitespace (even Linebreaks).
`;

console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));

let newStr = str.replace(regExAll,"🐔");
console.log(`Replaced with:`,newStr); //Index: 0

O código acima funciona no Chrome, mas a sbandeira ainda não foi implementada no Firefox, mas será em breve .



0

Eu recomendo o uso /(?=.*...)/g

Exemplo

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true

const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true

const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true

const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

Use regex101 para testar


0

Honestamente, muitas das respostas são antigas, então descobri que, se você simplesmente testasse qualquer string, independentemente do conteúdo do caractere com "/.*/i", obterá TUDO o suficiente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.