Сопоставление и возврат значения с использованием подстановочного знака с регулярным выражением в Ruby - PullRequest
1 голос
/ 12 ноября 2010

Допустим, у меня есть жало с количеством слов, разделенных пробелами. Каждое слово имеет однозначное число после него. Если у меня есть слово, можно ли найти слово в строке и вернуть его вместе с числом после него? (с использованием Ruby)

Например:

string = "test0 chance1 already0 again4"
word = "chance"

Как я могу получить возвращаемое значение "chance1"?

Обновление:

/word\d+/.match(string) returns "chance1"

Кажется, это работает.

Ответы [ 3 ]

1 голос
/ 12 ноября 2010

Ваш образец и обновление не работают:

Update:

/string\d+/.match(word) returns "chance1"
This seems to be working.

Выгрузка в IRB показывает:

>> string = "test0 chance1 already0 again4" #=> "test0 chance1 already0 again4"
>> word = "chance" #=> "chance"
>> /string\d+/.match(word) #=> nil

, так что не работает.

IРекомендую:

>> Hash[*string.scan(/(\w+)(\d)/).flatten]['chance'] #=> "1"

или

>> hash = Hash[*string.scan(/(\w+)(\d)/).flatten]
>> hash['chance'] #=> "1"
>> hash['test'] #=> "0"
>> hash['again'] #=> "4"

Работает путем сканирования слов, заканчивающихся цифрой, и раздельного захвата слова и цифры.String.scan вернет массив массивов, где каждый внутренний массив содержит соответствующие группы.

>> string.scan(/(\w+)(\d)/) #=> [["test", "0"], ["chance", "1"], ["already", "0"], ["again", "4"]]

Затем я выравниваю его, чтобы получить список слов, за которым следует их совпадающая цифра

>> string.scan(/(\w+)(\d)/).flatten #=> ["test", "0", "chance", "1", "already", "0", "again", "4"]

, и превращаю его в хеш.

>> Hash[*string.scan(/(\w+)(\d)/).flatten] #=> {"test"=>"0", "chance"=>"1", "already"=>"0", "again"=>"4"}

Тогда это простой случай запроса хэша для значения, которое соответствует определенному слову.

String.scan является мощным, но часто упускается из виду.Для программистов на Perl это похоже на использование сопоставления с шаблоном m//g.

Вот немного другой способ заполнения хеша:

>> string.scan(/(\w+)(\d)/).inject({}){|h,a| h[a[0]]=a[1]; h} #=> {"test"=>"0", "chance"=>"1", "already"=>"0", "again"=>"4"}
0 голосов
/ 12 ноября 2010
result = string.match Regexp.new(word + '\d')

Это объединяет word с \d (регулярное выражение для одной цифры), которое в вашем случае будет компилироваться в /chance\d/, что будет соответствовать слову "шанс" с любой одной цифрой после него. Затем он проверит строку на совпадение, и вы получите 'chance1' в строке.

0 голосов
/ 12 ноября 2010

Разделите строку на слова, затем найдите, какое из них содержит целевое слово.

string.split(' ').find {|s| s.index word}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...