У меня нет доступа к коду, это через интерфейс, который позволяет мне редактировать только регулярное выражение, которое анализирует ответы пользователей. Мне нужно извлечь вес после текста пользователей, где они пишут такие вещи, как:

wt 172.5 172.5 lbs 180 wt. 173.22 172,5

Мне нужно зафиксировать вес как поле с плавающей запятой, но я хочу ограничить его максимум одним десятичным знаком. Я пробовал использовать /(?<val>[\d+((\.|,)\d\d?)?]/, но он сохраняет только первую цифру "1" в поле

2
Mark Summers 19 Фев 2016 в 20:53

2 ответа

Лучший ответ

Иногда то, что кажется самым простым, - нет. Я предлагаю использовать это регулярное выражение:

r = /(?<=\A|\s)\d+(?:[.,]\d)?(?=\d|\s|\z)/

В качестве альтернативы мы можем определить регулярное выражение, используя режим расширенный или свободный интервал (добавив модификатор x после последнего /), что позволяет нам включить документацию:

r = /
    (?<=\A|\s)  # match beginning of string or space in a positive lookbehind
    \d+         # match one or more digits
    (?:[.,]\d)? # optionally (? after non-capture group) match a . or , then a digit
    (?=\d|\s|\z) # match a digit, space or the end of the string in a positive lookahead
    /x

"wt 172.5"[r]      #=> "172.5" 
"172.5 lbs"[r]     #=> "172.5" 
"180"[r]           #=> "180" 
"wt. 173.22"[r]    #=> "173.2" 
"172,5"[r]         #=> "172,5" 
"A1 143.66"[r]     #=> "143.6" 
"A1 1.3.4 43.6"[r] #=> "43.6" 
2
Cary Swoveland 19 Фев 2016 в 21:32
\d+(?:[,.]\d{1,2})?

Полагаю, вы этого хотели. [] - это класс персонажа, а не то, что вы думаете. Ваш класс персонажа захватывает только один из всех символов, которые вы определили.

См. Демонстрацию.

https://regex101.com/r/eB8xU8/12

0
vks 19 Фев 2016 в 18:20