2012-04-02 4 views
1

Ich versuche, das erste Wort in dieser Zeichenfolge zu erhalten: Basic (11/17/2011 - 12/17/2011)Regulärer Ruby-Ausdruck für diese Zeichenfolge?

So letztlich Basic aus, dass bekommen will.

Anderes Beispiel string: Premium (11/22/2011 - 12/22/2011)

Das Format ist immer „Single-Wort von geklammerten Datumsbereich gefolgt“ und ich will nur das einzelne Wort.

+0

Suchen Sie für diese Struktur innerhalb eines beliebige Textpassage? Die aktuelle Fragestellung gibt Ihnen nur Antworten zum Finden von 'Basic' innerhalb von' Basic (17.11.2011 - 17.12.2011) '. – RobinGower

Antwort

4

Gebrauch verwenden diese:

str = "Premium (11/22/2011 - 12/22/2011)" 
str.split.first # => "Premium" 

Die Split verwendet ' ' als Standardparameter, wenn Sie nicht angeben.
Danach erhalten Sie das erste Element mit first

+0

Wo wäre der Datumsparameter in dieser Methode? – sln

+0

Gefällt mir: '" Premium (11/22/2011 - 12/22/2011) ". Split.first' –

+0

Ich denke, er erwartet variable Eingabe.Woher weißt du, dass der "eingeklammerte Datumsbereich" vorhanden ist? – sln

2

Sie brauchen nicht regexp für das, können Sie nur

str.split(' ')[0] 
+0

Dies gibt das erste Wort zurück, ob es vor einem eingeklammerten Datumsbereich angezeigt wird oder nicht. Es nahm auch an, dass die gewünschte Zeichenfolge am Anfang der Zeichenfolge angezeigt wird. –

+0

Er sagt in seiner eigenen Frage, dass es immer dieses Format ist. –

+0

Was passiert, wenn der Datumsparameter nicht in der Zeichenfolge enthalten ist? – sln

0

Dieser reguläre Ausdruck wird aus dem hinteren Raum

"^\w+ ??" 
0

das erste Wort übereinstimmen Wenn Sie wirklich ein regex möchten, können Sie die erste Gruppe nach der Verwendung dieser erhalten regex:

(\w*) .* 
+0

Dies entspricht einer Zeichenfolge, die nur ein Leerzeichen enthält. – sln

+0

nein, '.' kann auch ein Leerzeichen sein –

+0

Das einzige, was in deiner Regex benötigt wird, ist ein Leerzeichen, alles andere ist optional. Daher stimmt eine Zeichenfolge mit einem einzelnen Leerzeichen mit dem Leerzeichen in Ihrer Regex überein. Obwohl '.' passt ein Leerzeichen an, es wird in diesem Fall nicht übereinstimmen. – sln

1

ich weiß, dass Sie die Antwort gefunden Sie benötigen aber für den Fall auf dem jemand stolpert in der Zukunft, um den benötigten Wert aus einem großenzu ziehen 10 von unbekannter Länge:

word_you_need = s.slice(/(\b[a-zA-Z]*\b \(\d+\/\d+\/\d+ - \d+\/\d+\/\d+\))/).split[0] 
+0

Das '\ b. * \ B' an sich passt 'Basic (17.11.2011 - 17.12.2011)', sogar '\ b. *? \ b' passt zu' Basic training'. – sln

+0

Guter Punkt. Ich habe "\ b. * \ B" in "\ b [a-zA-Z] * \ b" geändert. Das sollte also funktionieren, es sei denn, das beabsichtigte Wort hat einen Bindestrich oder ein anderes Sonderzeichen. –

+0

Warum nicht nur '/ (\ S * \ s + \ (\ d + \/\ d + \/\ d + - \ d + \/\ d + \/\ d + \)) /' dann? – sln

0

„Single-Wort von geklammerten Datumsbereich gefolgt“

‚Wort‘ und ‚klammerten Datumsbereich‘ besser
wie durch Ihre Anforderung Anweisung definiert werden sollen, sie sollten Anker und/oder Delimeter sein.

Diese rohen Regex sind nur eine allgemeine Vermutung.

\w+(?=\s*\([^)]*\)) 

oder

\w+(?=\s*\(\s*\d+(?:/\d+)*\s*-\s*\d+(?:/\d+)*\s*\)) 
0

Eigentlich alles, was Sie brauchen, ist:

s.split[0] 

... oder ...

s.split.first 
Verwandte Themen