2012-10-13 23 views
9

Was ist der Unterschied zwischen diesen beiden (String#scan und String#split) in Ruby?Unterschied zwischen String.scan und String.split

+0

Was ist der Unterschied? Das einzige, was sie gemeinsam haben, ist, dass sie beide von einem "String" -Objekt oder einer Kindklasse aufgerufen werden. Was schien so verwirrend? Diese Frage könnte gerade durch einen Blick auf den Rubin Doc gelöst werden. – Shoe

Antwort

19

Sie dienen ganz anderen Zwecken. String#scan wird verwendet, um Übereinstimmungen eines regulären Ausdrucks aus einer Zeichenfolge zu extrahieren und die Übereinstimmungen in einem Array zurückzugeben, während String#split eine Zeichenfolge basierend auf einem Begrenzungszeichen in ein Array aufteilen soll. Das Trennzeichen kann entweder eine statische Zeichenfolge (wie ;, die auf ein einzelnes Semikolon aufgeteilt werden soll) oder ein regulärer Ausdruck (wie /\s/+ zum Aufteilen auf beliebige Leerzeichen) sein.

Die Ausgabe von String#split enthält das Trennzeichen nicht. Stattdessen würde alles außer dem Begrenzer im Ausgabe-Array zurückgegeben werden, während die Ausgabe von String#scannur enthalten würde, was mit dem Begrenzer übereinstimmt.

# A delimited string split on | returns everything surrounding the | delimiters 
"a|delimited|string".split("|") 
# Prints: ["a", "delimited", "string"] 

# The same string scanninng for | only returns the matched | 
"a|delimited|string".scan("|") 
# Prints: ["|", "|"] 

Beide oben genannten würde auch einen regulären Ausdruck anstelle des einfachen String "|" akzeptieren.

# Split on everything between and including two t's 
"a|delimited|string".split(/t.+t/) 
# Prints: ["a|delimi", "ring"] 

# Search for everything between and including two t's 
"a|delimited|string".scan(/t.+t/) 
# Prints: ["ted|st"]