Como combinar "qualquer caractere" na expressão regular?

305

O seguinte deve ser correspondido:

AAA123
ABCDEFGH123
XXXX123

posso fazer ".*123":?

Saobi
fonte
2
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
Delan Azabani
fonte
22
Nem sempre o ponto é significa qualquer caractere. Exceção quando o modo de linha única. \ p {all} deveria ser
marciano 25/05
Como você pode incluir uma barra invertida nessa lista de personagens?
Resultados da Web Resultados da Web Pi
1
@pippilongstocking A barra invertida é `\\`
Poutrathor
58

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:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
BlueRaja - Danny Pflughoeft
fonte
11
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.

thr
fonte
11

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.

Veja também

poligenelubricants
fonte
1
Voto positivo apenas para o link regular-expressions.info. Site maravilhoso para aprender expressões regulares e para referência.
Freiheit
9

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

Huusom
fonte
1
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.

Jamie Davis
fonte
2
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;


public class RegularExpression{

    public static void main(String[] args){

        final String regex_1 = "[\\s\\S]*";
        final String regex_2 = "[\\d\\D]*";
        final String regex_3 = "[\\w\\W]*";
        final String string = "AAA123\n\t"
             + "ABCDEFGH123\n\t"
             + "XXXX123\n\t";

        final Pattern pattern_1 = Pattern.compile(regex_1);
        final Pattern pattern_2 = Pattern.compile(regex_2);
        final Pattern pattern_3 = Pattern.compile(regex_3);

        final Matcher matcher_1 = pattern_1.matcher(string);
        final Matcher matcher_2 = pattern_2.matcher(string);
        final Matcher 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));
        }
    }
}

Resultado

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

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:

insira a descrição da imagem aqui

Emma
fonte
1
Isso já não está respondido aqui? stackoverflow.com/a/55149095/5424988
O quarto pássaro
eu gosto em (\W|\w)*vez de dupla fuga
Sudip Bhattarai 03/03
1
Realmente útil explicando
Nagibaba 11/03
5

Solução específica para o problema de exemplo: -

Tente [A-Z]*123$irá corresponder a 123, AAA123, ASDFRRF123. Caso você precise de pelo menos um personagem antes de 123usar [A-Z]+123$.

Solução geral para a pergunta (como combinar "qualquer caractere" na expressão regular):

  1. Se você estiver procurando algo, incluindo espaço em branco, poderá tentar [\w|\W]{min_char_to_match,}.
  2. Se você estiver tentando corresponder a qualquer coisa, exceto espaço em branco, você pode tentar [\S]{min_char_to_match,}.
Akash Kumar Seth
fonte
2

[^]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:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.
Anônimo
fonte
Você se importaria de adicionar algum código para nos informar o que você tentou?
precisa
1

Experimente o regex .{3,}. Isso corresponderá a todos os caracteres, exceto uma nova linha.

Ravi Shekhar
fonte
-4

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");
}
Abrahan Gonzalez
fonte