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.
String.length()
?String.split()
oderStringTokenizer
) zu teilen und dann jede Wortlänge zu betrachten?Antworten:
Ich denke du willst
\b\w{1,10}\b
. Das\b
entspricht einer Wortgrenze.Natürlich können Sie auch das ersetzen
\b
und 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.quelle
\b
sollte 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.{
damit dies funktioniert.^\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.
quelle
^
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\b
ihrer Stelle Wortgrenzenanker verwenden: Sie\b\w{1,10}\b
finden Wörter der Länge 1 bis 10.^(?:\w{9}|\w{12})$
^\w{9}|\w{12}$
und es funktionierte nicht LoL, es stellte sich heraus, dass ich die Erfassung brauche( )
Länge der zu vergleichenden Zeichen.
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}?
quelle
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}\\b
funktioniert 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
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
RegEx Circuit
jex.im visualisiert reguläre Ausdrücke:
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.
quelle
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}$
quelle