Come abbinare "qualsiasi personaggio" in espressioni regolari?


305

È necessario abbinare quanto segue:

AAA123
ABCDEFGH123
XXXX123

posso fare ".*123":?


2
Questo link mostra un approccio che sembra funzionare -> [^] + Il che significa "non corrispondono a nessun carattere", un doppio negativo che può rileggere come "corrisponde a qualsiasi carattere". Fonte - loune.net/2011/02/…
HockeyJ

Risposte:


645

Si, puoi. Dovrebbe funzionare.

  • . = qualsiasi carattere
  • \. = il carattere punto reale
  • .?= .{0,1}= corrisponde a qualsiasi carattere zero o uno volte
  • .*= .{0,}= corrisponde a qualsiasi carattere zero o più volte
  • .+= .{1,}= corrisponde a qualsiasi carattere una o più volte

22
Non sempre punto significa qualsiasi carattere. Eccezione in modalità linea singola. \ p {all} dovrebbe essere
martian

Come puoi includere una barra rovesciata in questo elenco di personaggi?
Risultati ricerca Risultati web Pi

1
@pippilongstocking La barra rovesciata è `\\`
Poutrathor

58

Sì, funzionerà, sebbene si noti che .non corrisponderà a newline a meno che non si passi il flag DOTALL durante la compilazione dell'espressione:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();

11
Ecco alcune informazioni molto utili! Ho pensato .che corrispondesse a newline. Sono contento di aver letto la tua risposta, devo usarla!
Ben Kane,

A volte potrebbe anche essere necessario abbinare le nuove righe nelle regex Java in contesti in cui non è possibile passare Pattern.DOTALL, come quando si esegue una ricerca regex multilinea in Eclipse o come utente di qualsiasi applicazione Java che offre la ricerca regex. Sulla base della guida di regular-expression.info , potrebbe essere necessario utilizzare {.,\n,\r,\u2028,\u2029,\u0085}per abbinare qualsiasi carattere (i caratteri Unicode sono caratteri di fine riga aggiuntivi aggiunti non corrispondenti .in Java), ma funzionerebbero solo {.,\n,\r}per la maggior parte dei file di testo.
Theodore Murdock,

8
@TheodoreMurdock [\s\S]è un modo popolare di abbinare qualsiasi personaggio se non puoi usare DOTALL.
mpen

Nel caso in cui ti venisse in mente, NON usare (?:.|\\v)*, a causa di JDK-6337993 .
Olivier Cailloux il

22

Usa lo schema .per abbinare qualsiasi personaggio una volta, .*per abbinare qualsiasi carattere zero o più volte, .+per abbinare qualsiasi personaggio una o più volte.


11

Esistono molti sofisticati strumenti di test e sviluppo regex, ma se vuoi semplicemente un semplice cablaggio di test in Java, eccone uno con cui giocare:

    String[] tests = {
        "AAA123",
        "ABCDEFGH123",
        "XXXX123",
        "XYZ123ABC",
        "123123",
        "X123",
        "123",
    };
    for (String test : tests) {
        System.out.println(test + " " +test.matches(".+123"));
    }

Ora puoi facilmente aggiungere nuovi test e provare nuovi schemi. Divertiti a esplorare regex.

Guarda anche


1
Esegui l'upgrade solo per il link regular-expressions.info. Sito meraviglioso per l'apprendimento di espressioni regolari e per riferimento.
Freiheit,

9

No, *corrisponderà a zero o più caratteri. Dovresti usare +, che corrisponde a uno o più invece.

Questa espressione potrebbe funzionare meglio per te: [A-Z]+123


1
Vota qui. L'OP non ha specificato, ma sembra corretto aggiungere che il modello corrisponderà a qualsiasi carattere, inclusi elementi come ### 123, 123123,% $ # 123 che l'OP potrebbe non desiderare. La classe di caratteri @Huusom usa sopra tutti gli OP per usare solo caratteri alfabetici maiuscoli che potrebbero essere stati l'intento.
techdude,

9

Il modo più comune che ho visto per codificare questo è con una classe di caratteri i cui membri formano una partizione dell'insieme di tutti i possibili personaggi.

Di solito le persone che scrivono come [\s\S](spazi bianchi o non spazi bianchi), anche se [\w\W], [\d\D]e così via sarebbe tutto il lavoro.


2
Per riferimento, da regular-expressions.info/dot.html : "JavaScript e VBScript non hanno un'opzione per rendere i punti di interruzione di riga di corrispondenza dei punti. In tali lingue, è possibile utilizzare una classe di caratteri come [\ s \ S] per abbinare qualsiasi carattere. Questo personaggio corrisponde a un personaggio che è o uno spazio bianco (inclusi i caratteri di interruzione di riga) o un personaggio che non è uno spazio bianco. Poiché tutti i personaggi sono spazi bianchi o non bianchi, questa classe di caratteri corrisponde a qualsiasi personaggio ".
Decano o

7

.*e .+sono per tutti i caratteri ad eccezione di nuove righe.

Doppia fuga

Nel caso in cui volessi includere nuove righe, le seguenti espressioni potrebbero funzionare anche per quei linguaggi che richiedono il doppio escape come Java o C ++:

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

per zero o più volte, oppure

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

per una o più volte.

Escaping singolo:

Il doppio escape non è richiesto per alcune lingue come C #, PHP, Ruby, PERL, Python, JavaScript:

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

Test

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));
        }
    }
}

Produzione

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 desideri esplorare l'espressione, è stata spiegata nel pannello in alto a destra di regex101.com . Se lo desideri, puoi anche guardare in questo link , come corrisponderebbe ad alcuni input di esempio.


Circuito RegEx

jex.im visualizza le espressioni regolari:

inserisci qui la descrizione dell'immagine



mi piace (\W|\w)*invece di doppia fuga
Sudip Bhattarai


5

Soluzione specifica al problema di esempio: -

Prova [A-Z]*123$corrisponderà 123, AAA123, ASDFRRF123. Nel caso in cui sia necessario almeno un personaggio prima 123dell'uso [A-Z]+123$.

Soluzione generale alla domanda (Come abbinare "qualsiasi carattere" nell'espressione regolare):

  1. Se stai cercando qualcosa tra cui spazi bianchi puoi provare [\w|\W]{min_char_to_match,}.
  2. Se stai cercando di abbinare qualsiasi cosa tranne gli spazi bianchi, puoi provare [\S]{min_char_to_match,}.

2

[^]dovrebbe corrispondere a qualsiasi personaggio, incluso newline. [^CHARS] corrisponde a tutti i personaggi tranne quelli in CHARS . Se CHARS è vuoto, corrisponde a tutti i caratteri.

Esempio JavaScript:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.

Ti dispiacerebbe aggiungere del codice per farci sapere cosa hai provato?
Jennis Vaishnav,

1

Prova la regex .{3,}. Questo corrisponderà a tutti i personaggi tranne una nuova riga.


-4

Lavoro questo Non sempre punto è significa qualsiasi carattere. Eccezione in modalità linea singola. \p{all}dovrebbe essere

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");
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.