2009-07-27 10 views
2

Ich muss einen regulären Ausdruck (in Javascript) erstellen, der einer bestimmten Satzstruktur entspricht. In meinem Fall ist es "Kurs ### Tag ###", wobei ### eine 1 bis 3-stellige Zahl sein kann. Zusätzlich kann es "Woche" statt "Tag" sein, daher ist auch "Kurs ### Woche ###" gültig.Wie passe ich einen ganzen Satz in Javascript Regular Expressions?

Bisher habe ich kommen mit:

var regTest=/^(Course) \d{1,3} (day)|(week) \d{1,3}$/ 

Das Problem ist, dass dieser Ausdruck „Course 9 Tage 1“ entspricht, das ist, was ich will, aber es wäre auch „Course 9 Tage entsprechen 1 geplant am 07/01/09 ".

Mit anderen Worten, gibt die folgenden Wert von 0:

"Course 9 day 1".search(regTest) 

Aber auch diese wieder 0:

"Course 9 day 1 scheduled on 07/01/09".search(regTest) 

ich den ersten Test 0 zurückkehren will, aber ich will die zweite, um -1 zurückzugeben. Ich brauche den Ausdruck NUR bis zum ### folgenden Tag/Woche. Wie schaffen Sie es, an diesem Punkt zu stoppen?

+0

Versuchen Sie, etwas aus der Zeichenfolge zu extrahieren, oder möchten Sie nur bestätigen, dass die Zeichenfolge dem Muster entspricht? – Prestaul

Antwort

0

Eine zusätzliche Ebene der Gruppierung ist erforderlich:

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/ 
3

Sie müssen die OR (das Rohr) in die Klammer zwischen dem Tag und Woche verschieben:

/^(Course) \d{1,3} (day|week) \d{1,3}$/ 

Wenn das Rohr innen die Parens dann passt es "Tag" oder "Woche" in dieser Position. Wenn sich das Rohr nicht innerhalb eines Parens befindet, stimmt es entweder mit der ersten Hälfte des Ausdrucks (d. H. "Kurs ### Tag") oder mit der letzten Hälfte des Ausdrucks (d. H. "Woche ###") überein.

Auch, wenn Sie nur zu bestätigen versuchen, dass die Zeichenfolge das Muster übereinstimmt Sie „Test“ und nicht als „Suche“ verwenden können:

if(/^(Course) \d{1,3} (day|week) \d{1,3}$/.test(someString)) { 
    // it matches! 
} 
+0

Danke für den Fang! –

0

Sie wollen

var regTest=/^(Course) \d{1,3} (day|week) \d{1,3}$/ 

(Beachten Sie, dass (day)|(week) wurde in (day|week) geändert). Deine alte Regex war eigentlich zwei, verbunden mit dem |. Du siehst, | ist eine der weniger (am wenigsten?) eng bindende Regex-Metazeichen, was bedeutet, dass ab|cd "ab" und "cd" übereinstimmen, aber nicht "abd" oder "acd".

0

Sie haben alles richtig, außer dass Sie die Prüfung für (day)|(week) in einer Klammer Block setzen müssen, das heißt

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/ 

Sie können tatsächlich die Anweisung

var regTest=/^Course \d{1,3} (day|week) \d{1,3}$/ 

BTW reduzieren, ich weiß warum brauchen Sie nicht die Klammer um Course. Ich bin nicht sicher, warum Sie sie nicht um day und week benötigen. Wenn ich Zugang zu sed hätte, würde ich gerne sehen, wie es ((day)|(week)) gegenüber (day|week) behandelt wurde.

Verwandte Themen