2016-03-29 5 views
0

zu bekommen, wenn ich zum Beispiel eine Liste von Strings habe wie 'car 24', 'house', 'charlet bundle 54', 'chroma5one jenkin 4', 'm8rial imperial 54'. Ich möchte einen Regex Matcher erstellen, so dass jedes der Elemente die entsprechenden Ergebnisse ergibt:Spiel Zeichenfolge und Nummer mit Regex die Position und Menge aus dem String

"car 24" #=> {item: 'car', quantity: 24} 
"house" #=> {item: 'house', quantity: nil} 
"charlet bundle 54" #=> {item: 'charlet bundle', quantity: 54} 
"chroma5one jenkin 4" #=> {item: 'chroma5one jenkin', quantity: 4} 
"m8rial imperial 50" #=> {item: 'm8rial imperial', quantity: 50} 
"hou58" #=> {item: 'hou58', quantity: nil} 

Bisher habe ich verschiedene Methoden ausprobiert, aber sie scheinen nicht perfekt zu funktionieren. Zum Beispiel (?<item>[[a-zA-Z0-9\s]*]+)(?<quantity>\d+)? Eine, die zu arbeiten scheint, ist: , aber es erfordert immer einen leeren Platz nach jedem Ausdruck. Jede Hilfe wäre willkommen. Danke

+0

Sind sie Saiten? Wenn ja, machen Sie es deutlich, indem Sie sie als String-Literale schreiben. Außerdem ist '=>' innerhalb der Code-Formatierung verwirrend mit dem Hash-Literal. Ändern Sie es in '# =>'. – sawa

+1

Was wäre, wenn du "hou58" hättest? Was ist das erwartete Ergebnis? '{item:" hou ", Menge: 58}', '{item:" hou5 ", Menge: 8}', '{item:" hou58 ", Menge: nil}' oder etwas anderes? – sawa

+1

danke @sawa. Ich habe gerade das Beispiel des '' hou58'' aktualisiert. es sollte zurückgeben '{item:" hou58 ", menge: nil}' – oreoluwa

Antwort

1
string = 'm8rial imperial 54' 

string.scan(/\A([\w\W]+?)(?:\s+(\d+))?\z/).map { |(i,q)| {:item => i, :quantity => q} } 
    #=> [{:item=>"m8rial imperial", :quantity=>"54"}] 

Ist das wonach Sie suchen?

Sie teilt Ihre Zeichenfolge in zwei Teile auf, wenn am Ende eine Ganzzahl (im Format "Zeichenfolge") vorhanden ist. Wenn nicht, wird Ihre gesamte Zeichenfolge unter item und nil unter quantity platziert.

2
R =/
    \s+  # match > 0 whitespace characters 
    (?=\d) # match a digit in a positive lookahead 
    /x  # free-spacing regex definition mode 

def make_hash(str) 
    item, quantity = str.split(R) 
    { item: item, quantity: quantity } 
end 

['car 24', 'house', 'charlet bundle 54', 'chroma5one jenkin 4', 
'm8rial imperial 54', 'hou58'].each { |s| puts make_hash(s) } 
    # {:item=>"car", :quantity=>"24"} 
    # {:item=>"house", :quantity=>nil} 
    # {:item=>"charlet bundle", :quantity=>"54"} 
    # {:item=>"chroma5one jenkin", :quantity=>"4"} 
    # {:item=>"m8rial imperial", :quantity=>"54"} 
    # {:item=>"hou58", :quantity=>nil} 
Verwandte Themen