Mam ciąg w Ruby:
sentence = "My name is Robert"
Jak mogę łatwo zamienić dowolne słowo w tym zdaniu bez użycia złożonego kodu lub pętli?
Mam ciąg w Ruby:
sentence = "My name is Robert"
Jak mogę łatwo zamienić dowolne słowo w tym zdaniu bez użycia złożonego kodu lub pętli?
Odpowiedzi:
sentence.sub! 'Robert', 'Joe'
Nie spowoduje wyjątku, jeśli zastąpionego słowa nie ma w zdaniu ( []=
wariant zrobi to).
Powyższe zastępuje tylko pierwszą instancję „Roberta”.
Aby zastąpić wszystkie wystąpienia, użyj gsub
/ gsub!
(tzn. „Globalne podstawienie”):
sentence.gsub! 'Robert', 'Joe'
Powyższe zastąpi wszystkie wystąpienia Roberta Joe.
Jeśli masz do czynienia z tekstem w języku naturalnym i chcesz zamienić słowo, a nie tylko część ciągu, musisz dodać do gsub szczyptę wyrażeń regularnych, ponieważ zwykłe zastąpienie tekstu może prowadzić do katastrofalnych rezultatów:
'mislocated cat, vindicating'.gsub('cat', 'dog')
=> "mislodoged dog, vindidoging"
Wyrażenia regularne mają granice słów, na przykład takie, \b
które pasują do początku lub końca słowa. A zatem,
'mislocated cat, vindicating'.gsub(/\bcat\b/, 'dog')
=> "mislocated dog, vindicating"
W Rubim, w przeciwieństwie do niektórych innych języków, takich jak JavaScript, granice słów są zgodne z UTF-8, więc możesz używać go w językach z alfabetem innym niż łaciński lub rozszerzonym alfabetem łacińskim:
'сіль у кисіль, для весіль'.gsub(/\bсіль\b/, 'цукор')
=> "цукор у кисіль, для весіль"
\b
nie działają w nich, w takich przypadkach należy użyć analizatorów morfologicznych lub podobnych rzeczy. Również +1 za zabawny przykład.
Możesz spróbować użyć tej metody:
sentence ["Robert"] = "Roger"
Wtedy zdanie stanie się:
sentence = "My name is Roger" # Robert is replaced with Roger
IndexError
. W przeciwnym razie słowo nie będące częścią zdania prowadzi do:string not matched (IndexError)
my
)?