Ruby'de bir dizenin içinden bir alt dizeyi nasıl çıkarabilirim?
Misal:
String1 = "<name> <substring>"
Ben ayıklamak istiyorum substring
den String1
(son oluş içinde yani her şey <
ve >
).
Ruby'de bir dizenin içinden bir alt dizeyi nasıl çıkarabilirim?
Misal:
String1 = "<name> <substring>"
Ben ayıklamak istiyorum substring
den String1
(son oluş içinde yani her şey <
ve >
).
Yanıtlar:
String1.scan(/<([^>]*)>/).last.first
scan
her biri için, bir dizi oluşturur <item>
in String1
arasında metin içeren <
ve >
(bir normal ifade yakalama gruplarını ihtiva eden birlikte kullanıldığında, tarama her bir maç için yakalar ihtiva eden bir dizi oluşturur, çünkü) tek eleman dizideki. last
size bu dizilerin sonunu first
verir ve sonra size içindeki dizeyi verir.
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"
scan
Tek bir sonuca ihtiyacımız varsa kullanmaya gerek yok .
Ruby'lerimiz match
varken Python'u kullanmaya gerek yok String[regexp,#]
.
Bakınız: http://ruby-doc.org/core/String.html#method-i-5B-5D
Not: str[regexp, capture] → new_str or nil
if we need only one result
ettim. Ve match()[]
daha yavaştır çünkü bu bir yerine iki yöntemdir.
string[regex]
bu senaryoda da aynı derecede okunabilir olduğunu düşünüyorum , bu yüzden kişisel olarak kullandım.
Bunun için normal bir ifadeyi oldukça kolay bir şekilde kullanabilirsiniz ...
Kelimenin etrafında boşluklara izin vermek (ancak onları tutmamak):
str.match(/< ?([^>]+) ?>\Z/)[1]
Veya izin verilen boşluklar olmadan:
str.match(/<([^>]+)>\Z/)[1]
<>
Sonuncunun dizedeki son şey olması gerektiğinden emin değilim . Örneğin dizeye foo <bar> baz
izin veriliyorsa (ve sonucu vermesi gerekiyorsa bar
), bu çalışmayacaktır.
match
Yöntemi kullanarak biraz daha esnek bir yaklaşım burada . Bununla, birden fazla dizeyi ayıklayabilirsiniz:
s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)
# Use 'captures' to get an array of the captures
matchdata.captures # ["ants","pants"]
# Or use raw indices
matchdata[0] # whole regex match: "<ants> <pants>"
matchdata[1] # first capture: "ants"
matchdata[2] # second capture: "pants"