Ich möchte über eine Zeichenfolge mit einem Regex-Muster iterieren. Ich muss über die Übereinstimmungen sowie die Nicht-Übereinstimmungen zwischen ihnen iterieren und auf die Match-Informationen während der Iteration zugreifen.Gibt es eine Möglichkeit, während der Iteration mit `String # split 'auf die letzten Übereinstimmungsinformationen zuzugreifen?
Wenn ich nicht die Nicht-Übereinstimmungen zugreifen müssen, dann kann ich es tun mit String#scan
:
"some string".scan(/(some pattern)|(another pattern)/) do
if $1 then ...
elsif $2 then ...
end
end
Aber ich brauche auch über die nicht passenden Teile zu durchlaufen, also muss ich wohl Verwenden Sie String#split
. Aber String#split
muss kein Block, und wenn ich each
nachdem es verwenden möchte:
"some string".split(/((some pattern)|(another pattern))/).each do
...
end
dann kann ich keinen Zugriff auf das Spiel Informationen in den Block. Ich möchte wie etwas tun:
"some string".split(/((some pattern)|(another pattern))/) do
if $2 then ...
elsif $3 then ...
else ... # access the non-matching part
end
end
Gibt es eine Möglichkeit das letzte Spiel auf Informationen zuzugreifen, während sie mit String#split
Iterieren?
kann ich es Brute gewaltsam scan
mit und das Hinzufügen von |(.*?)
am Ende der Regex:
"some string".scan(/(some pattern)|(another pattern)|(.*?)/) do
if $1 then ...
elsif $2 then ...
elsif $3 then ...
end
end
aber ein nicht gieriges Spiel mit sehr ineffizient ist, und ich kann es nicht verwenden.
Es funktioniert, die Idee ist gut, aber es ist nicht bevorzugt, rekursive Aufruf wie folgt zu verwenden. Vielleicht können Sie eine ähnliche Sache stattdessen mit Iteration tun. – sawa
@sawa iterative Version hinzugefügt – user12341234