Hoe de "Split" -methode in Ruby te gebruiken

click fraud protection

Zoals je misschien al weet, strings in Robijn zijn wat bekend staat als eersteklas objecten die een aantal methoden gebruiken voor vragen en manipulatie.

Een van de meest elementaire string manipulatie acties is het splitsen van een string in meerdere sub-strings. Dit zou bijvoorbeeld worden gedaan als je een string als deze hebt"foo, bar, baz" en je wilt de drie snaren "foo", "bar" en "baz". De splitsen methode van de String-klasse kan dit voor u bereiken.

Het basisgebruik van "Split"

Het meest elementaire gebruik van de splitsen methode is om een ​​string te splitsen op basis van een enkel teken of een statische reeks tekens. Als het eerste argument van split een tekenreeks is, worden de tekens in die tekenreeks gebruikt als scheidingsteken voor tekenreeksen, terwijl in door komma's gescheiden gegevens de komma wordt gebruikt om gegevens te scheiden.

#! / usr / bin / env robijn
str = "foo, bar, baz"
zet str.split (",")
$ ./1.rb
foo
bar
baz

Voeg flexibiliteit toe met reguliere expressies

Er zijn eenvoudigere manieren om de

instagram viewer
draad. Het gebruik van een reguliere expressie als scheidingsteken maakt de splitsingsmethode een stuk flexibeler.

Nogmaals, neem bijvoorbeeld de string "foo, bar, baz". Er is een spatie na de eerste komma, maar niet na de tweede. Als de tekenreeks "," wordt gebruikt als scheidingsteken, blijft er aan het begin van de tekenreeks "bar" nog een spatie staan. Als de tekenreeks "," wordt gebruikt (met een spatie na de komma), komt deze alleen overeen met de eerste komma omdat de tweede komma er geen spatie achter heeft. Het is erg beperkend.

De oplossing voor dit probleem is het gebruik van een reguliere expressie als argument voor het scheidingsteken in plaats van een tekenreeks. Met reguliere expressies kunt u niet alleen statische reeksen tekens matchen, maar ook onbepaalde aantallen tekens en optionele tekens.

Reguliere uitdrukkingen schrijven

Bij het schrijven van een reguliere expressie voor uw scheidingsteken, is de eerste stap om in woorden te beschrijven wat het scheidingsteken is. In dit geval is de zinsnede "een komma die kan worden gevolgd door een of meer spaties" redelijk.

Er zijn twee elementen in deze regex: de komma en de optionele spaties. De spaties gebruiken de * (ster of asterisk) kwantor, wat "nul of meer" betekent. Elk element dat hieraan voorafgaat, komt nul of meer keren overeen. Bijvoorbeeld de regex /a*/ komt overeen met een reeks van nul of meer 'a'-tekens.

#! / usr / bin / env robijn
str = "foo, bar, baz"
zet str.split (/, * /)
$ ./2.rb
foo
bar
baz

Het aantal splitsingen beperken

Stel je een door komma's gescheiden waardereeks voor, zoals "10,20,30, dit is een willekeurige string". Dit formaat bestaat uit drie cijfers gevolgd door een commentaarkolom. Deze commentaarkolom kan willekeurige tekst bevatten, inclusief tekst met komma's erin. Voorkomen splitsen door de tekst van deze kolom te splitsen, kunnen we een maximumaantal kolommen instellen om te splitsen.

Notitie: Dit werkt alleen als de commentaarreeks met de willekeurige tekst de laatste kolom van de tabel is.

Om het aantal splitsingen dat de splitmethode zal uitvoeren te beperken, geeft u het aantal velden in de tekenreeks als tweede argument door aan de splitmethode, zoals hieronder:

#! / usr / bin / env robijn
str = "10,20,30, tien, twintig en dertig"
zet str.split (/, * /, 4)
$ ./3.rb
10
20
30
Tien, twintig en dertig

Bonusvoorbeeld!

Wat als je zou willen gebruiken splitsen om alle items te krijgen behalve de allereerste?

Het is eigenlijk heel simpel:

eerst * rest = ex.split (/, /)

De beperkingen kennen

De splitsingsmethode heeft een aantal vrij grote beperkingen.

Neem bijvoorbeeld de string '10, 20, 'Bob, Eve and Mallory', 30 '. Wat bedoeld is, zijn twee cijfers, gevolgd door een string tussen aanhalingstekens (die komma's kan bevatten) en vervolgens een ander nummer. Splitsen kan deze tekenreeks niet correct in velden verdelen.

Om dit te doen, moet de snaarscanner zijn stateful, wat betekent dat het kan onthouden of het binnen een aanhalingstekenreeks staat of niet. De gesplitste scanner is niet stateful en kan dus geen problemen zoals deze oplossen.

instagram story viewer