2016-09-05 5 views
0

Habe Ruby vor kurzem abgeholt und habe damit herumgespielt. Ich wollte lernen, wie man mit Regex oder anderen Ruby-Tricks nach bestimmten Wörtern, Leerzeichen, gültigem Format usw. in einer gegebenen Textzeile sucht.Ruby Parsing und Regex

Lassen Sie sich sagen, dass ich eine Bestellliste, die genau wie diese in diesem Format aussieht:

cost: 50 items: book,lamp 

Einen Raum nach Semikolon, kein Platz nach jedem Komma, keine Hinter Leerzeichen am Ende und solche Sachen. Wie kann ich mit Ruby auf Fehler in diesem Format prüfen? Dies sollte zum Beispiel meiner Prüfungen nicht:

cost:  60 items:shoes,football 

Mein Ziel war es, die Schnur durch eine „aufzuspalten“ und prüfen, ob das erste Wort war zu sehen, „Kosten“, wenn das zweite Wort eine Zahl und so weiter war aber ich erkannte, dass das Aufteilen auf ein "" mir nicht hilft, nach zusätzlichen Leerzeichen zu suchen, da es nur auffressst. Es hilft mir auch nicht, nach Leerzeichen zu suchen. Wie gehe ich dabei vor?

+0

Wie auch immer Sie es tun, dies ist ein sehr schönes Beispiel für die Entwicklung Ihrer TDD (testgetriebene Entwicklung)/Testfähigkeiten. Zum Zeitpunkt des Kommentierens würde ich vorschlagen, dass Sie weitermachen und etwas Zeit damit verbringen, mit "Minitest" und Ihrem Problem zu spielen. – Felix

+1

':' ist ein Doppelpunkt. ';' ist ein Semikolon. – tadman

Antwort

2

Sie könnten den folgenden regulären Ausdruck verwenden.

r =/
    \A    # match beginning of string  
    cost:\s   # match "cost:" followed by a space 
    \d+\s    # match > 0 digits followed by a space 
    items:\s   # match "items:" followed by a space 
    [[:alpha:]]+  # match > 0 lowercase or uppercase letters 
    (?:,[[:alpha:]]+) # match a comma followed by > 0 lowercase or uppercase 
         # letters in a non-capture group (?: ...) 
    *     # perform the match on non-capture group >= 0 times 
    \z    # match the end of the string 
    /x    # free-spacing regex definition mode 

"cost: 50 items: book,lamp"   =~ r #=> 0 (a match, beginning at index 0) 
"cost: 50 items: book,lamp,table" =~ r #=> 0 (a match, beginning at index 0) 
"cost:  60 items:shoes,football" =~ r #=> nil (no match) 

Die Regex kann, kann natürlich in der üblichen Weise geschrieben werden:

r = /\Acost:\s\d+\sitems:\s[[:alpha:]]+(?:,[[:alpha:]]+)*\z/ 

oder

r = /\Acost: \d+ items: [[:alpha:]]+(?:,[[:alpha:]]+)*\z/ 

obwohl ein Leerzeichen (\s) nicht durch einen Raum in der Fassung Freiraummodusdefinition (\x).

+0

Um explizit ein Leerzeichen im freien Zeichenmodus zu finden, können Sie '\' oder '\ u0020' oder' [] 'verwenden. – Stefan

+0

Danke, @Stefan. –

+0

Danke @CarySwoveland. Einfach weiter drücken, gibt es eine Möglichkeit, das Vorhandensein von Unterstrichen und Zahlen und Bindestrichen (keine Leerzeichen) in die Liste der Elemente aufzunehmen? Wie wenn der Gegenstand ein "version_2_vaccuum" anstelle von etwas einfachem wie "lamp" wäre. Wird nach der Arbeit von [: alpha:] ein "\ w" hinzugefügt? –