Zamień słowa w ciągu - Ruby

281

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?

Mithun Sasidharan
źródło
Wymień w jaki sposób? Zastąpić dowolne słowo (słowo nr 2) lub określone słowo ( my)?
Blender
Dziękujemy za krótkie, proste i przydatne pytanie. pomogło mi znalezienie rozwiązania hashtagami stylu moim zdaniem
Stef hej

Odpowiedzi:

494
sentence.sub! 'Robert', 'Joe'

Nie spowoduje wyjątku, jeśli zastąpionego słowa nie ma w zdaniu ( []=wariant zrobi to).

Jak zastąpić wszystkie wystąpienia?

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.

srcspider
źródło
Wydaje się, że zastępuje to tylko pierwszą instancję, co oczywiście jest czasem w porządku, a czasem nie.
Jason Swett,
@JasonSwett zaktualizował odpowiedź, aby uwzględnić sposób zastąpienia wszystkich instancji.
srcspider
128

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, \bktó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/, 'цукор')
=> "цукор у кисіль, для весіль"
Hnatt
źródło
6
Zauważ, że niektóre języki nawet nie używają spacji, więc \bnie działają w nich, w takich przypadkach należy użyć analizatorów morfologicznych lub podobnych rzeczy. Również +1 za zabawny przykład.
NiñoScript
57

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
Mithun Sasidharan
źródło
4
To całkiem interesujące. Nigdy wcześniej nie widziałem tej metody wymiany.
Sean Hill,
6
Czy nie pojawi się błąd przy tej metodzie, jeśli oryginalny ciąg nie zawiera słowa, które próbujesz zastąpić?
srcspider
2
Po prostu upewnij się, że włączysz IndexError. W przeciwnym razie słowo nie będące częścią zdania prowadzi do:string not matched (IndexError)
Konrad Reiche,
9
Innym problemem związanym z tą metodą jest to, że zastępuje ona tylko pierwszą instancję ciągu.
Martin Konecny
14
Jest to interesujące, ale zdecydowanie nie powinno być oznaczone jako poprawna odpowiedź.
Niels Abildgaard
46

Po pierwsze, nie deklarujesz typu w Ruby, więc nie potrzebujesz pierwszego string.

Aby zamienić słowo w ciągu, to zrobić: sentence.gsub(/match/, "replacement").

Sean Hill
źródło