Este link mostra uma abordagem que parece funcionar -> [^] + O que significa 'não corresponde a nenhum caractere', um duplo negativo que pode ser lido novamente como 'corresponde a qualquer caractere'. Fonte - loune.net/2011/02/...
HockeyJ
Respostas:
645
Sim você pode. Isso deve funcionar.
. = qualquer caractere
\. = o caractere de ponto real
.?= .{0,1}= corresponde a qualquer caractere zero ou uma vez
.*= .{0,}= corresponde a qualquer caractere zero ou mais vezes
.+= .{1,}= corresponde a qualquer caractere uma ou mais vezes
Essa é uma informação muito útil! Eu supus .que corresponderia a novas linhas. Estou feliz por ler sua resposta, preciso usá-la!
Ben Kane
Às vezes, também é necessário corresponder novas linhas nas regexes Java em contextos em que não é possível passar o Pattern.DOTALL, como ao fazer uma pesquisa de regex de várias linhas no Eclipse ou como usuário de qualquer aplicativo Java que ofereça pesquisa de regex. Com base no guia do regular-expression.info , você pode precisar usar {.,\n,\r,\u2028,\u2029,\u0085}para corresponder absolutamente a qualquer caractere (os caracteres Unicode são caracteres de terminação de linha adicionais, adicionados não correspondidos pelo .Java), mas {.,\n,\r}funcionariam para a maioria dos arquivos de texto.
Theodore Murdock
8
@TheodoreMurdock [\s\S]é uma maneira popular de combinar qualquer caractere se você não puder usar DOTALL.
MPEN
Caso isso lhe vier à cabeça, NÃO use (?:.|\\v)*, por causa do JDK-6337993 .
Olivier Cailloux
22
Use o padrão .para corresponder a qualquer caractere uma vez, .*para corresponder a qualquer caractere zero ou mais vezes, .+para corresponder a qualquer caractere uma ou mais vezes.
Existem muitas ferramentas sofisticadas de teste e desenvolvimento de expressões regulares, mas se você quer apenas um equipamento de teste simples em Java, aqui está uma para você brincar:
String[] tests ={"AAA123","ABCDEFGH123","XXXX123","XYZ123ABC","123123","X123","123",};for(String test : tests){System.out.println(test +" "+test.matches(".+123"));}
Agora você pode adicionar facilmente novos casos de teste e experimentar novos padrões. Divirta-se explorando regex.
Voto por favor aqui. O OP não especificou, mas parece correto adicionar que o padrão corresponderá a qualquer caractere, incluindo coisas como ### 123, 123123,% $ # 123 que o OP pode não desejar. A classe de caracteres que @Huusom usa acima fará todo o OP para usar apenas caracteres alfabéticos em maiúsculas que possam ter sido a intenção.
techdude
9
A maneira mais comum que eu vi para codificar isso é com uma classe de caracteres cujos membros formam uma partição do conjunto de todos os caracteres possíveis.
Normalmente as pessoas escrevem isso como [\s\S](espaços em branco ou não-espaço em branco), embora [\w\W], [\d\D]etc. faria todo o trabalho.
Para referência, em regular-expressions.info/dot.html : "JavaScript e VBScript não têm uma opção para fazer o ponto corresponder aos caracteres de quebra de linha. Nesses idiomas, você pode usar uma classe de caracteres como [\ s \ S] para corresponder a qualquer caractere.Este caractere corresponde a um caractere de espaço em branco (incluindo caracteres de quebra de linha) ou a um caractere que não é um caractere de espaço em branco.Como todos os caracteres são espaços em branco ou não em branco, essa classe de caractere corresponde a qualquer caractere . "
Dean Ou
7
.*e .+são para quaisquer caracteres, exceto para novas linhas.
Escapamento duplo
Caso deseje incluir novas linhas, as seguintes expressões também podem funcionar para as linguagens em que é necessário escape duplo, como Java ou C ++:
[\\s\\S]*[\\d\\D]*[\\w\\W]*
por zero ou mais vezes, ou
[\\s\\S]+[\\d\\D]+[\\w\\W]+
por uma ou mais vezes.
Escapamento único:
O escape duplo não é necessário para algumas linguagens como C #, PHP, Ruby, PERL, Python, JavaScript:
[\s\S]*[\d\D]*[\w\W]*[\s\S]+[\d\D]+[\w\W]+
Teste
import java.util.regex.Matcher;import java.util.regex.Pattern;publicclassRegularExpression{publicstaticvoid main(String[] args){finalString regex_1 ="[\\s\\S]*";finalString regex_2 ="[\\d\\D]*";finalString regex_3 ="[\\w\\W]*";finalString string ="AAA123\n\t"+"ABCDEFGH123\n\t"+"XXXX123\n\t";finalPattern pattern_1 =Pattern.compile(regex_1);finalPattern pattern_2 =Pattern.compile(regex_2);finalPattern pattern_3 =Pattern.compile(regex_3);finalMatcher matcher_1 = pattern_1.matcher(string);finalMatcher matcher_2 = pattern_2.matcher(string);finalMatcher matcher_3 = pattern_3.matcher(string);if(matcher_1.find()){System.out.println("Full Match for Expression 1: "+ matcher_1.group(0));}if(matcher_2.find()){System.out.println("Full Match for Expression 2: "+ matcher_2.group(0));}if(matcher_3.find()){System.out.println("Full Match for Expression 3: "+ matcher_3.group(0));}}}
Se você deseja explorar a expressão, ela foi explicada no painel superior direito de regex101.com . Se desejar, também é possível assistir neste link , como ele corresponderia a algumas entradas de amostra.
[^]deve corresponder a qualquer caractere, incluindo nova linha. [^CHARS] corresponde a todos os caracteres, exceto aqueles em CHARS . Se CHARS estiver vazio, ele corresponderá a todos os caracteres.
Eu trabalho isso Nem sempre o ponto é significa qualquer caractere. Exceção quando o modo de linha única. \p{all}deveria estar
String value ="|°¬<>!\"#$%&/()=?'\\¡¿/*-+_@[]^^{}";String expression ="[a-zA-Z0-9\\p{all}]{0,50}";if(value.matches(expression)){System.out.println("true");}else{System.out.println("false");}
Respostas:
Sim você pode. Isso deve funcionar.
.
= qualquer caractere\.
= o caractere de ponto real.?
=.{0,1}
= corresponde a qualquer caractere zero ou uma vez.*
=.{0,}
= corresponde a qualquer caractere zero ou mais vezes.+
=.{1,}
= corresponde a qualquer caractere uma ou mais vezesfonte
Sim, isso funcionará, embora observe que
.
não corresponderá às novas linhas, a menos que você passe o sinalizador DOTALL ao compilar a expressão:fonte
.
que corresponderia a novas linhas. Estou feliz por ler sua resposta, preciso usá-la!{.,\n,\r,\u2028,\u2029,\u0085}
para corresponder absolutamente a qualquer caractere (os caracteres Unicode são caracteres de terminação de linha adicionais, adicionados não correspondidos pelo.
Java), mas{.,\n,\r}
funcionariam para a maioria dos arquivos de texto.[\s\S]
é uma maneira popular de combinar qualquer caractere se você não puder usar DOTALL.(?:.|\\v)*
, por causa do JDK-6337993 .Use o padrão
.
para corresponder a qualquer caractere uma vez,.*
para corresponder a qualquer caractere zero ou mais vezes,.+
para corresponder a qualquer caractere uma ou mais vezes.fonte
Existem muitas ferramentas sofisticadas de teste e desenvolvimento de expressões regulares, mas se você quer apenas um equipamento de teste simples em Java, aqui está uma para você brincar:
Agora você pode adicionar facilmente novos casos de teste e experimentar novos padrões. Divirta-se explorando regex.
Veja também
fonte
Não,
*
corresponderá a zero ou mais caracteres. Você deveria usar+
, o que corresponde a um ou mais.Esta expressão pode funcionar melhor para você:
[A-Z]+123
fonte
A maneira mais comum que eu vi para codificar isso é com uma classe de caracteres cujos membros formam uma partição do conjunto de todos os caracteres possíveis.
Normalmente as pessoas escrevem isso como
[\s\S]
(espaços em branco ou não-espaço em branco), embora[\w\W]
,[\d\D]
etc. faria todo o trabalho.fonte
Escapamento duplo
Caso deseje incluir novas linhas, as seguintes expressões também podem funcionar para as linguagens em que é necessário escape duplo, como Java ou C ++:
por zero ou mais vezes, ou
por uma ou mais vezes.
Escapamento único:
O escape duplo não é necessário para algumas linguagens como C #, PHP, Ruby, PERL, Python, JavaScript:
Teste
Resultado
Se você deseja explorar a expressão, ela foi explicada no painel superior direito de regex101.com . Se desejar, também é possível assistir neste link , como ele corresponderia a algumas entradas de amostra.
Circuito RegEx
O jex.im visualiza expressões regulares:
fonte
(\W|\w)*
vez de dupla fugaSolução específica para o problema de exemplo: -
Tente
[A-Z]*123$
irá corresponder a123
,AAA123
,ASDFRRF123
. Caso você precise de pelo menos um personagem antes de123
usar[A-Z]+123$
.Solução geral para a pergunta (como combinar "qualquer caractere" na expressão regular):
[\w|\W]{min_char_to_match,}
.[\S]{min_char_to_match,}
.fonte
[^]
deve corresponder a qualquer caractere, incluindo nova linha.[^
CHARS]
corresponde a todos os caracteres, exceto aqueles em CHARS . Se CHARS estiver vazio, ele corresponderá a todos os caracteres.Exemplo de JavaScript:
fonte
Experimente o regex
.{3,}
. Isso corresponderá a todos os caracteres, exceto uma nova linha.fonte
Eu trabalho isso Nem sempre o ponto é significa qualquer caractere. Exceção quando o modo de linha única.
\p{all}
deveria estarfonte