Javascript: заменить все, кроме цифр и разрешить только одну точку - PullRequest
1 голос
/ 15 марта 2019

Это работает для целых чисел, например ::10000

'123x'.replace(/\D/g, '')
'123'

Какое регулярное выражение могло бы достичь того же, но разрешить только одну точку? Примеры:

  • 1 -> 1
  • 1x -> 1
  • 10. -> 10.
  • 10.0 -> 10.0
  • 10.01 -> 10.01
  • 10.01x -> 10.01
  • 10.01. -> 10.01

Ответы [ 5 ]

3 голосов
/ 15 марта 2019

С двумя заменами:

console.log("a12b3.1&23.0a2x".replace(/[^.\d]/g, '')
                             .replace(/^(\d*\.?)|(\d*)\.?/g, "$1$2"));

Первое действие удалит все символы, кроме цифр и точек

Вторая замена соответствует последовательности цифр, за которой, возможно, следует точка, но это происходит двумя разными способами. Когда такая последовательность происходит в начале строки, необязательная точка помещается внутри первой группы захвата, в то время как для всех других совпадений точка является вне (второй) группы захвата .

Существует две группы захвата, но для любого данного совпадения только одна из них будет иметь контент. Таким образом, захваченный контент может быть воспроизведен в любом случае с $1$2. Это будет включать в себя первый пункт, но исключить любой другой.

2 голосов
/ 15 марта 2019

Вы можете использовать parseFloat и преобразовать обратно в строку.

console.log(parseFloat('10.01.x').toString());

Подход с регулярным выражением.

function convert(s) {
    return s.match(/^\d+\.?\d*/)[0];
}

console.log(['1', '1x', '10.', '10.0', '10.01', '10.01x', '10.01.'].map(convert));
1 голос
/ 15 марта 2019

UPDATE

Почему бы просто не сделать это старой школы:

    function formatNumber(s) {
        var hadDot = false, result = '';
        for (var i = 0; i < s.length; i++) {
            var c = s[i];
            if (c >= '0' && c <= '9')
              result += c;
            else if (!hadDot && c == '.') {
              hadDot = true;
              result += c;
            }
        }
        return result;
    }
    var inputs = ['10.01.x23.5asd6', '10.', '10', '.12vx12.1f53', '10.10.'];
    for (var i = 0; i < inputs.length; i++) {
      console.log(formatNumber(inputs[i]));
    }

Требуется всего одна итерация строки, так что вы, вероятно, не получите лучшего времени выполнения.

СТАРЫЙ ОТВЕТ, НЕ РАБОТАЕТ

Это также должно работать (но это не так, благодаря Trincot за указание на это):

function formatNumber(s) {
    return s.replace(/[^\d\.]/g, '').replace(/\.(([^\.]*)\.)*/g, '.$2');
}
var inputs = ['10.01.x23.5asd6', '10.', '10', '.12vx12.1f53', '10.10.'];
for (var i = 0; i < inputs.length; i++) {
  console.log(formatNumber(inputs[i]));
}

Сначала замените все нецифровые символы и точки. Затем запишите все после первой точки и замените все, что не является точкой. Но для этого нужно два шага регулярного выражения.

1 голос
/ 15 марта 2019

Вы можете сделать что-то вроде этого, нужно два метода замены:

  1. Для удаления всего, кроме цифры и точки. Для этого используйте отрицательный символьный класс `[^ \ d.].
  2. Для удаления повторяющихся точек используйте замену обратным вызовом, где нам нужно заменить содержимое после первой точки, поэтому используйте \.([.\d]+)$ для сопоставления всей строки после первого выполнения (включая точку), а в обратном вызове удалите все оставшиеся точки из захваченного значения (строка после первой точки).

'123x'.replace(/[^\d.]/g, '').replace(/\.([.\d]+)$/,function(m,m1){
   return '.' + m1.replace(/\./g, '')
})

ДЕМО:

var arr = ['1', '1x', '10.', '10.0', '10.01', '10.01x', '10.01.', '10.01.23', 'a1b2c3d.e4f5g6h'];

function format(str) {
  return str.replace(/[^\d.]/g, '').replace(/\.([.\d]+)$/, function(m, m1) {
    return '.' + m1.replace(/\./g, '')
  });
}

arr.forEach((v) => console.log(`${v} => ${format(v)}`))
0 голосов
/ 15 марта 2019

let arr = ['1', '1x', '10.', '10.0', '10.01', '10.01x', '10.01.', '10.01.23', 'a1b2c3d.e4f5g6h'];

arr.forEach(val => {
	val = val.replace(/[^\d.]/g, '').match(/([0-9]+(\.[0-9]*)?)/);
	if (val) console.log(val[0]);
})

replace(/[^\d.]/g, '') для замены любого нецифрового символа и не . символа.

[0-9]+ цифры от 0 до 9 будут сопоставлены, а + для match one or more time

., за которым следует точка.

[0-9]*? соответствует от 0 до 9 (но соответствует нулю или более раз)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...