2017-02-22 19 views
-1

Я использую Rails 5. У меня проблема с регулярным выражением. Я хочу написать выражение, которое будет анализировать строку, ища положительное число, а затем первое слово, которое следует за номером, независимо от того, существует ли пробел или другой тип границы слова между числом и следующим словом. Поэтому я пробовалКак написать регулярное выражение для захвата слова после номера?

2.4.0 :006 > str = "2g" 
=> "2g" 
2.4.0 :007 > str.match(/\W?(([0-9]+(\.[0-9]+)?)\W*(^[0-9:\/]+))/) 
=> nil 

, но, как вы видите, совпадений нет. Я ожидал бы, что матч зафиксирует «2», а затем «g». Точно так же, если у меня есть строка, как

2.4.0 :008 > str = "12.2 word next" 
=> "12.2 word next" 
2.4.0 :009 > str.match(/\W?(([0-9]+(\.[0-9]+)?)\W*(^[0-9:\/]+))/) 
=> nil 

Я ожидаю, что регулярное выражение захватить «12,2», а затем следующее слово «слово». Но, как вы видите, мое регулярное выражение не разрезает его. Как исправить это, чтобы зафиксировать то, что мне нужно?

+0

пытается выбрать «12.2word» или «12.2 word» в «12.2 word next»? – MohaMad

+0

Я хотел бы иметь что-то, что выбирает массив - первый элемент - это число, «12.2», а второй элемент - это слово, «слово» (т.е. [«12.2», «word»]) – Dave

+0

Вы можете найти это в моем отредактированном ответе @Dave – MohaMad

ответ

0

Вы пытаетесь выбрать «12.2word» или «12.2 word» в «12.2 word next»?

Как вы ответили в комментариях, чтобы иметь число с плавающей запятой в group1 и слова в group2:

(\d+\.\d+|\d+)[^a-zA-Z0-9]*([a-zA-Z]+) 
Full match 6-15 `12.2 good` 
Group 1. 6-10 `12.2` 
Group 2. 11-15 `good` 


Мой первый ответ был:

(\d+(\.\d{0,})?)[^a-zA-Z0-9]*([a-zA-Z]+) 
for " 12.2 good " 
Full match 6-15 `12.2 good` 
Group 1. 6-10 `12.2` 
Group 2. 8-10 `.2` 
Group 3. 11-15 `good` 

Group1 ваша целая часть и Group2 является null или равно .2 в этом примере.

0

Это должно работать.

([0-9.]+)\s(\w+) 

Вход:

12.2 word 

Выход:

12.2 
word 

рубин Код:

re = /([0-9.]+)\s(\w+)/ 
str = '12.2 word' 

# Print the match result 
str.scan(re) do |match| 
    puts match.to_s 
end 

См: https://regex101.com/r/ncVEAT/1

+0

Хотя это работает на «12.2 word», оно не работает на «12.2-word next» или «12.2word next», оба из которых я хочу иметь «12.2» в качестве первого совпадения eleemnt и «word» в качестве второго совпадающего элемента. – Dave

+0

Использовать '[^ a-zA-Z0-9]' вместо '\ s' @Dave – MohaMad

+0

Это регулярное выражение соответствует' 1.2.27 word' does '1.2.27' является вашим принятым совпадением? – MohaMad

Смежные вопросы