Wie kann man "irgendeinen Charakter" im regulären Ausdruck zuordnen?

304

Folgendes sollte übereinstimmen:

AAA123
ABCDEFGH123
XXXX123

kann ich tun : ".*123"?

Saobi
quelle
2
Dieser Link zeigt einen Ansatz, der zu funktionieren scheint -> [^] + Was bedeutet, dass keine Zeichen übereinstimmen, ein doppeltes Negativ, das erneut als "mit jedem Zeichen übereinstimmen" gelesen werden kann. Quelle - loune.net/2011/02/…
HockeyJ

Antworten:

644

Ja, du kannst. Das sollte funktionieren.

  • . = irgendein Zeichen
  • \. = das tatsächliche Punktzeichen
  • .?= .{0,1}= ein beliebiges Zeichen null oder einmal übereinstimmen
  • .*= .{0,}= ein beliebiges Zeichen null oder mehrmals übereinstimmen
  • .+= .{1,}= ein oder mehrere Zeichen übereinstimmen
Delan Azabani
quelle
22
Nicht immer bedeutet Punkt ein Zeichen. Ausnahme im einzeiligen Modus. \ p {all} sollte sein
Mars
Wie können Sie einen umgekehrten Schrägstrich in diese Zeichenliste aufnehmen?
Suchergebnisse Web-Ergebnisse Pi
1
@pippilongstocking Rückwärts Schrägstrich ist `\\`
Poutrathor
58

Ja, das wird funktionieren. Beachten Sie jedoch, dass .die Zeilenumbrüche nur dann übereinstimmen, wenn Sie beim Kompilieren des Ausdrucks das DOTALL- Flag übergeben:

Pattern pattern = Pattern.compile(".*123", Pattern.DOTALL);
Matcher matcher = pattern.matcher(inputStr);
boolean matchFound = matcher.matches();
BlueRaja - Danny Pflughoeft
quelle
11
Das sind einige sehr nützliche Informationen! Ich nahm an, dass .die Zeilenumbrüche übereinstimmen würden. Ich bin froh, dass ich deine Antwort gelesen habe, das muss ich nutzen!
Ben Kane
Manchmal müssen Sie auch Zeilenumbrüche in Java-Regexen in Kontexten abgleichen, in denen Sie Pattern.DOTALL nicht übergeben können, z. B. bei einer mehrzeiligen Regex-Suche in Eclipse oder als Benutzer einer Java-Anwendung, die Regex-Suche anbietet. Basierend auf dem Handbuch für reguläre Ausdrücke.info müssen Sie möglicherweise {.,\n,\r,\u2028,\u2029,\u0085}absolut jedes Zeichen abgleichen (die Unicode-Zeichen sind zusätzliche zeilenabschließende Zeichen, die .in Java nicht übereinstimmen ), {.,\n,\r}funktionieren jedoch nur für die meisten Textdateien.
Theodore Murdock
8
@TheodoreMurdock [\s\S]ist eine beliebte Methode, um einen beliebigen Charakter zu finden, wenn Sie DOTALL nicht verwenden können.
Mpen
Falls es Ihnen in den Sinn kommt, verwenden Sie es (?:.|\\v)*wegen JDK-6337993 NICHT .
Olivier Cailloux
22

Verwenden Sie das Muster ., um ein beliebiges Zeichen einmal, ein .*beliebiges Zeichen null oder mehrmals oder ein .+beliebiges Zeichen einmal oder mehrmals abzugleichen.

thr
quelle
11

Es gibt viele ausgefeilte Regex-Test- und Entwicklungstools. Wenn Sie jedoch nur ein einfaches Test-Harness in Java benötigen, können Sie mit folgenden Tools spielen:

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

Jetzt können Sie ganz einfach neue Testfälle hinzufügen und neue Muster ausprobieren. Viel Spaß beim Erkunden von Regex.

Siehe auch

Polygenschmierstoffe
quelle
1
Upvote nur für den regulären-expressions.info-Link. Wunderbare Seite zum Lernen regulärer Ausdrücke und als Referenz.
Freiheit
9

Nein, entspricht *null oder mehr Zeichen. Sie sollten verwenden +, was stattdessen einem oder mehreren entspricht.

Dieser Ausdruck könnte für Sie besser funktionieren: [A-Z]+123

Huusom
quelle
1
Upvote hier. Das OP hat nichts angegeben, aber es scheint richtig zu sein, hinzuzufügen, dass das Muster mit jedem Zeichen übereinstimmt, einschließlich Dingen wie ### 123, 123123,% $ # 123, die das OP möglicherweise nicht möchte. Die oben verwendete Zeichenklasse @Huusom verwendet im gesamten OP nur alphabetische Großbuchstaben, die möglicherweise beabsichtigt waren.
Techdude
9

Die häufigste Art, dies zu codieren, ist eine Zeichenklasse, deren Mitglieder eine Partition des Satzes aller möglichen Zeichen bilden.

Normalerweise Leute schreiben , dass als [\s\S](Leerzeichen oder nicht-Leerzeichen), obwohl [\w\W], [\d\D]etc. würden alle arbeiten.

Jamie Davis
quelle
2
Als Referenz aus regulär-expressions.info / dot.html : "JavaScript und VBScript haben keine Option, um die Punkte mit Zeilenumbruchzeichen abzugleichen . In diesen Sprachen können Sie eine Zeichenklasse wie [\ s \ S] verwenden. Dieses Zeichen entspricht einem Zeichen, das entweder ein Leerzeichen (einschließlich Zeilenumbruchzeichen) oder ein Zeichen, das kein Leerzeichen ist. Da alle Zeichen entweder Leerzeichen oder Nicht-Leerzeichen sind, entspricht diese Zeichenklasse jedem Zeichen . "
Dean oder
7

.*und .+sind für alle Zeichen außer für neue Zeilen.

Doppelte Flucht

Nur für den Fall, dass Sie neue Zeilen einfügen möchten, funktionieren die folgenden Ausdrücke möglicherweise auch für Sprachen wie Java oder C ++, für die ein doppeltes Escapezeichen erforderlich ist:

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

für null oder mehr mal oder

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

für ein oder mehrere Male.

Single Escaping:

Für einige Sprachen wie C #, PHP, Ruby, PERL, Python, JavaScript ist kein doppeltes Escapezeichen erforderlich:

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

Prüfung

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

Ausgabe

Full Match for Expression 1: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 2: AAA123
    ABCDEFGH123
    XXXX123

Full Match for Expression 3: AAA123
    ABCDEFGH123
    XXXX123

Wenn Sie den Ausdruck untersuchen möchten, wurde er oben rechts auf regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.


RegEx Circuit

jex.im visualisiert reguläre Ausdrücke:

Geben Sie hier die Bildbeschreibung ein

Emma
quelle
1
Ist das hier nicht schon beantwortet? stackoverflow.com/a/55149095/5424988
Der vierte Vogel
Ich mag, (\W|\w)*anstatt doppelt zu entkommen
Sudip Bhattarai
1
Wirklich hilfreich zu erklären
Nagibaba
5

Spezifische Lösung für das Beispielproblem: -

Versuchen Sie [A-Z]*123$passt auf 123, AAA123, ASDFRRF123. Falls Sie vor der 123Verwendung mindestens ein Zeichen benötigen [A-Z]+123$.

Allgemeine Lösung für die Frage (Wie wird "ein beliebiges Zeichen" im regulären Ausdruck gefunden):

  1. Wenn Sie nach etwas suchen, einschließlich Leerzeichen, können Sie es versuchen [\w|\W]{min_char_to_match,}.
  2. Wenn Sie versuchen, etwas anderes als Leerzeichen zu finden, können Sie es versuchen [\S]{min_char_to_match,}.
Akash Kumar Seth
quelle
2

[^]sollte mit jedem Zeichen übereinstimmen, einschließlich Zeilenumbruch. [^CHARS] entspricht allen Zeichen außer denen in CHARS . Wenn CHARS leer ist, stimmt es mit allen Zeichen überein.

JavaScript-Beispiel:

/a[^]*Z/.test("abcxyz \0\r\n\t012789ABCXYZ") // Returns ‘true’.
Anonym
quelle
Würde es Ihnen etwas ausmachen, Code hinzuzufügen, um uns mitzuteilen, was Sie versucht haben?
Jennis Vaishnav
1

Probieren Sie die Regex .{3,}. Dies entspricht allen Zeichen außer einer neuen Zeile.

Ravi Shekhar
quelle
-4

Ich arbeite damit. Nicht immer bedeutet Punkt irgendein Zeichen. Ausnahme im einzeiligen Modus. \p{all}sollte sein

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
quelle