2016-02-19 8 views
2

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

wt 172.5 172.5 lbs 180 wt. 173.22 172,5

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

+1

В будущем вы можете подождать некоторое время, прежде чем выбирать ответ. Быстрый выбор может сопровождаться комментариями, выявляющими проблемы с ответом, может препятствовать другим, возможно лучшим ответам, и imo - это неудовольствие для тех, кто все еще работает над своими ответами. Многие здесь ждут хотя бы пару часов. Дело в том, что нет спешки. –

+0

@CarySwoveland Спасибо! Новое на форуме, это полезно обратная связь –

ответ

2

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

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

Мы можем альтернативно определить регулярное выражение, используя расширенный или свободно-Spacing режим (путем добавления модификатора 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" 
+0

Мне это нравится. Но! Что насчет '.5'? Вам нужно будет изменить свой '\ d +' на '\ d *' – marklark

+0

Mark, я намеренно не совпадал с '. .5'', но если вы хотите, ваши предлагаемые изменения выглядят правильно. –

+0

Спасибо, Кэри. Я думаю, что регулярные выражения «достаточно хороши» сложны, идеальные регулярные выражения почти невозможны. Я буду только утверждать, что мое решение стремится быть достаточно хорошим. – marklark

0
\d+(?:[,.]\d{1,2})? 

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

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

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

+0

Спасибо! Я нашел одно место, которое предложило [] захватить все, что угодно, но ваше решение отлично подходит для захвата. Любые мысли об ограничении захваченных данных до 1 десятичной точки? мой тест 183.235 сохранил все цифры –

+0

Я не думаю, что это будет записывать цифры справа от десятичной/запятой - и он захватывает несколько цифр вправо ... – marklark

+0

@marklark, пожалуйста, проверьте демо-версию – vks

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