Regex für Wörter einer bestimmten Länge

75

Ich würde gerne wissen, dass der reguläre Ausdruck mit Wörtern übereinstimmt, sodass die Wörter eine maximale Länge haben. Wenn beispielsweise ein Wort maximal 10 Zeichen lang ist, möchte ich, dass der reguläre Ausdruck übereinstimmt. Wenn die Länge jedoch 10 überschreitet, sollte der reguläre Ausdruck nicht übereinstimmen.

Ich habe es versucht

^(\w{10})$

Aber das bringt mir nur Übereinstimmungen, wenn die Mindestlänge des Wortes 10 Zeichen beträgt. Wenn das Wort mehr als 10 Zeichen enthält, stimmt es immer noch überein, stimmt jedoch nur mit den ersten 10 Zeichen überein.

Anand Hemmige
quelle
Gibt es einen Grund, warum Sie nicht einfach über Wörter iterieren und sie verwenden möchten String.length()?
MAK
1
Ja. Diese Zeichenfolge ist Teil einer größeren Zeichenfolge, die Wörter in verschiedenen Formaten - Datumsangaben, E-Mails, URLs usw. - in einem durch Tabulatoren getrennten Format enthält. Ich denke darüber nach, einen zusammengesetzten regulären Ausdruck zu schreiben, der der gesamten Zeile entspricht.
Anand Hemmige
Aha. Da die Wörter durch Tabulatoren begrenzt sind, ist es nicht möglich, sie (mit String.split()oder StringTokenizer) zu teilen und dann jede Wortlänge zu betrachten?
MAK
sehr viel möglich. Tatsächlich war das zuerst mein Gedanke, aber die Verwendung eines
regulären Ausdrucks

Antworten:

81

Ich denke du willst \b\w{1,10}\b. Das \bentspricht einer Wortgrenze.

Natürlich können Sie auch das ersetzen \bund tun ^\w{1,10}$. Dies entspricht einem Wort mit höchstens 10 Zeichen, solange es der einzige Inhalt der Zeichenfolge ist. Ich denke, das haben Sie vorher gemacht.

Da es sich um Java handelt, müssen Sie den Backslashes entkommen : "\\b\\w{1,10}\\b". Du hast das wahrscheinlich schon gewusst, aber es hat mich schon mal erwischt.

Tikhon Jelvis
quelle
Vielen Dank. Ich bin mir sicher, dass mich die Flucht auch schon einmal erwischt hat ..: 0 Der von Ihnen angegebene Ausdruck entspricht den 10 Zeichen, wenn das Wort größer als 10 ist. Ich möchte nicht, dass er übereinstimmt, wenn das Wort 10 Zeichen überschreitet. Eine Art Gegenteil von \ w {10,} könnte man sagen ...!
Anand Hemmige
1
@ AnandHemmige: Welcher Ausdruck? Der mit einem \bsollte mit nichts übereinstimmen, wenn das Wort mehr als 10 Zeichen enthält. Gleiches gilt für den, der mit endet $. Sie sollten Letzteres versuchen, wenn die Zeichenfolge nur ein Wort ist.
Tikhon Jelvis
1
In meiner VI-Version (gvim für Windows) benötige ich zuvor einen Backslash (\), {damit dies funktioniert.
Jenny O'Reilly
46
^\w{0,10}$ # allows words of up to 10 characters.
^\w{5,}$   # allows words of more than 4 characters.
^\w{5,10}$ # allows words of between 5 and 10 characters.
Tim Pietzcker
quelle
Ich hoffte, dass die erste davon als eine Art Gegenteil von \ w {10,} funktionieren würde, aber das tut es nicht.
Anand Hemmige
5
^und $verankern Sie den regulären Ausdruck am Anfang und Ende der Zeichenfolge. Wenn Sie Submatches (Wörter einer bestimmten Länge) extrahieren möchten, müssen Sie an \bihrer Stelle Wortgrenzenanker verwenden: Sie \b\w{1,10}\bfinden Wörter der Länge 1 bis 10.
Tim Pietzcker
Wie deklariere ich einen regulären Ausdruck von "erlaubt Wörter mit 9 oder 12 Zeichen"?
Loi Nguyen Huynh
1
@LoiNguyenHuynh:^(?:\w{9}|\w{12})$
Tim Pietzcker
@ TimPietzcker Ich hatte es selbst versucht ^\w{9}|\w{12}$und es funktionierte nicht LoL, es stellte sich heraus, dass ich die Erfassung brauche( )
Loi Nguyen Huynh
26

Länge der zu vergleichenden Zeichen.

{n,m}  n <= length <= m
{n}    length == n
{n,}   length >= n

Und standardmäßig ist die Engine gierig, um diesem Muster zu entsprechen. Wenn die Eingabe beispielsweise 123456789 lautet, stimmt \ d {2,5} mit 12345 mit der Länge 5 überein.

Wenn Sie möchten, dass die Engine zurückkehrt, wenn die Länge 2 übereinstimmt, verwenden Sie \ d {2,5}?

Kleenestar
quelle
3
Dies war nützlich für mich, da ich nach Regex suchte, um Wörter größer als x zu finden.
Zenil
3

Methode 1

Wortgrenzen würden hier perfekt funktionieren, wie zum Beispiel mit:

\b\w{3,8}\b
\b\w{2,}
\b\w{,10}\b
\b\w{5}\b

RegEx Demo 1

Java

Für einige Sprachen wie Java und C ++ ist eine doppelte Escape-Funktion erforderlich:

\\b\\w{3,8}\\b
\\b\\w{2,}
\\b\\w{,10}\\b
\\b\\w{5}\\b

PS: \\b\\w{,10}\\bfunktioniert möglicherweise nicht für alle Sprachen oder Geschmacksrichtungen.

Test 1

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "\\b\\w{3,8}\\b";
        final String string = "words with length three to eight";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }

    }
}

Ausgabe 1

Full match: words
Full match: with
Full match: length
Full match: three
Full match: eight

Methode 2

Eine andere gut bekannte Methode ist die Verwendung negativer Lookarounds:

(?<!\w)\w{3,8}(?!\w)
(?<!\w)\w{2,}
(?<!\w)\w{,10}(?!\w)
(?<!\w)\w{5}(?!\w)

Java

(?<!\\w)\\w{3,8}(?!\\w)
(?<!\\w)\\w{2,}
(?<!\\w)\\w{,10}(?!\\w)
(?<!\\w)\\w{5}(?!\\w)

RegEx Demo 2

Test 2

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "(?<!\\w)\\w{1,10}(?!\\w)";
        final String string = "words with length three to eight";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
        }

    }
}

Ausgabe 2

Full match: words
Full match: with
Full match: length
Full match: three
Full match: to
Full match: eight

RegEx Circuit

jex.im visualisiert reguläre Ausdrücke:

Geben Sie hier die Bildbeschreibung ein


Wenn Sie den Ausdruck vereinfachen / ändern / untersuchen möchten, wurde dies im oberen rechten Bereich von regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.


Emma
quelle
1

Sogar ich suchte nach dem gleichen regulären Ausdruck, aber ich wollte auch alle Sonderzeichen und Leerzeichen einbeziehen. Also hier ist der reguläre Ausdruck dafür:

^[A-Za-z0-9\s$&+,:;=?@#|'<>.^*()%!-]{0,10}$
Pardeep Dogra
quelle
1
Wie unterscheidet sich das von "^. {0,10} $"?
Elhitch