2015-02-09 6 views
0

Я пытаюсь найти строку с встроенными десятичными числами. Номер использует запятую (сто/тысячный разделитель) и точку для десятичного разделителя.Регулярное выражение для поиска десятичных чисел в строке

Пример недействительных десятичных чисел:

  • .33, 0,333 (номер должен предшествовать по крайней мере, 1 цифра хотя и ноль)
  • 1,22,33.33, 1,22.333 (последняя сегмент разделенной запятой цифр должен иметь 3 цифры)
  • 0,3, 0,3333 (Десятичный номер должен иметь 2 или 3 цифры после десятичной)
  • , 0,33 (Десятичное число не должно начинаться с запятой)

Пример допустимых десятичных чисел:

  • 0,33 & 10,333
  • 1,22,333.33 & 1,222.333

Особый случай: Если строка как «Вы/с bal.33.33" . Результат должен быть 33,33


Я попробовал следующее регулярное выражение:

(((\\d+\\,)+\\d{3})|([^,]\\d+))\\.\\d{2,3}(?!\\.\\d) 

Он работает для всех случаев, но терпит неудачу, когда число ведущих запятая.

+0

Нет это не должно иметь дробную часть. См. Недопустимый пример 3. – closure

+0

Итак, '1,2,3,4,5,666.78' действительно? – anubhava

+0

@anubhava: да, в данном примере выше. В идеале только первый сегмент может иметь одну цифру, все сегменты между ними должны иметь 2 или 3 цифры, но последний сегмент должен иметь 3 цифры. – closure

ответ

1

Вы можете использовать группы захвата, как

/(?:[^\d,]|^)(\d+(?:(?:,\d+)*,\d{3})?\.\d{2,3})\b/ 
  • Захват группы 1, (\d+(?:(?:,\d+)*,\d{3})?\.\d{2,3})\b будет содержать десятичное число в строка.

  • (?:[^\d,]|^) гарантирует, что группа захвата правильно фиксирует все цифры, а не часть их.

Regex Demo

Тест

var str = "0.33"; 
var matches = str.match(/(?:[^\d,]|^)(\d+(?:(?:,\d+)*,\d{3})?\.\d{2,3})\b/); 
console.log(matches[1]) 
=> 0.33 

var str = "You a/c bal.33.33" 
var matches = str.match(/(?:[^\d,]|^)(\d+(?:(?:,\d+)*,\d{3})?\.\d{2,3})\b/); 
console.log(matches[1]) 
=> 33.33 
+0

Спасибо NullPointer! Он работает отлично. – closure

+0

@closure Рад слышать, что это помогло: D. Убедитесь, что вы используете оператор 'if (matches)', чтобы позаботиться о случаях, когда строка не соответствует вашему регулярному выражению. – nu11p01n73R

+0

Этот номер спичек соответствует 1,222.3 & 1,222.3556 & 1,22,333,444.15 –

0

Просто попробуйте следующее регулярное выражение:

^\d+((,\d+)*,\d{3})?\.\d{2,3}$ 

demo

+0

Блестящий. но не выполняется для специального случая, приведенного выше. – closure

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