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.