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?


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.


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/, 'цукор')
=> "цукор у кисіль, для весіль"

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

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").

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.