2013-03-08 7 views
15

Ich habe eine regular expression geschrieben, die eine beliebige Anzahl von Buchstaben mit einer beliebigen Anzahl von einzelnen Leerzeichen zwischen den Buchstaben übereinstimmt. Ich möchte diesen regulären Ausdruck, um auch eine minimale und maximale Anzahl von Zeichen zu erzwingen, aber ich bin nicht sicher, wie man das macht (oder wenn es möglich ist).Min- und Max-Zeichen in einem regulären Ausdruck festlegen?

Mein regulärer Ausdruck ist:

[A-Za-z](\s?[A-Za-z])+ 

ich erkennen, dass es nur wurde passend zu zwei Sätze von Buchstaben einen einzigen Raum umgeben, so dass ich verändern es leicht, das zu beheben. Die ursprüngliche Frage ist jedoch immer noch dieselbe.

Gibt es eine Möglichkeit, mindestens drei Zeichen und maximal 30 zu erzwingen?

+0

Eine beliebige Anzahl von Buchstaben w/einer beliebigen Anzahl von einzelnen Leerzeichen verwenden, mit mindestens 3 und maximal 30 Zeichen? Es klingt wie '[A-Za-z] {3,30}' wird die Arbeit tun, da es Beschreibung passt. – nhahtdh

+0

@nhahtdh Das würde mehrere Leerzeichen in der Zeile zulassen. Es scheint, dass es keine anmutige Lösung gibt. – CorayThan

+0

Es ist möglich, wenn Sie ** alle ** die Anforderungen angeben. Ich kann nur sehen, dass mehrere Leerzeichen in einer Zeile von Ihrer Regex und nicht von Ihrer Beschreibung benötigt werden. – nhahtdh

Antwort

30

Ja

Genau wie + bedeutet eine oder mehrere können Sie {3,30} verwenden, um zwischen 3 und 30

Zum Beispiel [a-z]{3,30} Einstimmungen zwischen 3 und 30 Kleinbuchstaben Buchstaben

Vom documentation of the Pattern class

übereinstimmen
X{n,m} X, at least n but not more than m times 

In Ihrem Fall passende 3-30 durch Leerzeichen gefolgt Buchstaben könnte erreicht werden:

([a-zA-Z]\s){3,30} 

Wenn Sie Leerzeichen erfordern Hinter, wenn Sie nicht Sie verwenden können: (2-29 mal Brief + Raum , dann Schreiben)

([a-zA-Z]\s){2,29}[a-zA-Z] 

Wenn Sie Leerzeichen zählen als Zeichen möchten Sie diese Zahl durch 2 teilen müssen

([a-zA-Z]\s){1,14}[a-zA-Z] 

erhalten Sie kann \s? zu dem letzten hinzufügen, wenn das nachfolgende Leerzeichen optional ist. Diese wurden alle getestet auf RegexPlanet

Wenn Sie die gesamte Zeichenfolge zusammen sein möchten zwischen 3 und 30 Zeichen können Sie verwenden Lookaheads Zugabe (?=^.{3,30}$) am Anfang des RegExp und Entfernen der anderen Größenbeschränkungen

Alles, was sagte, ehrlich gesagt würde ich wahrscheinlich nur die String 's .length Eigenschaft testen. Es ist lesbarer.

+0

Und wie sollen wir es benutzen? – bsiamionau

+0

@zvzdhk Ich verstehe Ihre Frage nicht, möchten Sie Beispiele dafür, wie der Quantifizierer {n, m} verwendet werden soll? –

+0

Nein, ich möchte eine funktionierende Lösung für OP's Frage. – bsiamionau

5

Dies ist, was Sie für

suchen
^[a-zA-Z](\s?[a-zA-Z]){2,29}$ 

^ wird der Start der Zeichenfolge

$ ist das Ende der Schnur

(\s?[a-zA-Z]){2,29} entsprechen würde (\ s? [A-Za Z]) 2 bis 29 mal ..

+0

Das ist viel näher. Ich will eigentlich \ s? anstatt \ s *, weil ich maximal einen Platz haben möchte. Das einzige Problem ist, dass ich wollte, dass Leerzeichen in die Anzahl der Zeichen eingeschlossen werden. Ich dachte nur, dass es Spaß machen würde, in meine Regex das Äquivalent von "(myString.length()> 2 && myString.length() <31) einzufügen", also brauche ich keine zusätzlichen Checks in Java. – CorayThan

+0

Was ist der praktische Zweck von^und $? Zumindest in Java scheint mein Matcher ohne diese zu funktionieren. – CorayThan

+0

@CorayThan Wenn Sie die obige Regex ohne ^, $ mit ** find ** -Methode verwenden, würde es überall passen..so würde es auch jede Eingabe, die mehr als 30 Zeichen hat .. passen, wenn Sie ** Matches ** verwenden Methode würde es das Muster genau entsprechen und so müssen Sie nicht ^, $ verwenden, wenn Sie die Matches-Methode verwenden..mehr Info [hier] (http://StackOverflow.com/Questions/4450045/Difference-between-matches- and-find-in-java-regex) – Anirudha

3

Eigentlich Benjamin 's Antwort wird zu der kompletten Lösung für die OP's que führen stion. Mithilfe von Lookaheads ist es möglich, die Gesamtzahl der Zeichen einzuschränken UND die Übereinstimmung auf eine festgelegte Kombination von Buchstaben und (optionalen) einzelnen Leerzeichen zu beschränken.

Die Regex, dass das gesamte Problem

wird AAA, A A und auch AA A scheitern Diese
(?=^.{3,30}$)^([A-Za-z][\s]?)+$ 

würde löst Spiel Spiel, da es zwei aufeinander folgende Leerzeichen sind. Ich testete dies bei http://regexpal.com/ und es macht den Trick.

0

sollten Sie

[a-zA-Z ]{20} 

[für erlaubte Zeichen] {für Grenze der Anzahl der Zeichen}

Verwandte Themen