Как удалить все нечисловые символы (исключая минус, точку и запятую) в строке в Javascript? - PullRequest
1 голос
/ 16 октября 2019

Числовые символы:

0 1 2 3 4 5 6 7 8 9 dot comma minus at the start of the string

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

123 -> 123

123.45 -> 123.45

123,45 -> 123,45

-123 -> -123

-123.45 -> -123.45

-123,45 -> -123,45

--123.45 -> -123.45

--123,45 -> -123,45


a -> empty string

-a -> -

a123 -> 123

-a123 -> -123

a123.45 -> 123.45

-a123.45 -> -123.45

a123.b45 -> 123.45

-a123.b45 -> -123.45

123.-34 -> 123.34

-123.-34 -> -123.34

--123.-34 -> -123.34

Вот то, что у меня пока есть

"123.45abc".replace(/[^0-9.,]/g,""); -> 123.45

, но это не удается

"-123.45abc".replace(/[^0-9.,]/g,""); -> 123.45

Это работает

"-123.45abc".replace(/-[^0-9.,]/g,""); -> -123.45

, но теперь это не удается

"-123.45-abc".replace(/-[^0-9.,]/g,""); -> -123.45bc

Этот ответ почти решает мою проблему, ноЗнаки минус внутри строки не удаляются.

Я делаю это в JavaScript с помощью регулярных выражений. Regex не является обязательным.


Обновление Вход будет содержать не более одной запятой или одной точки. 12.34.56.78 никогда не будет введено

Ответы [ 5 ]

3 голосов
/ 16 октября 2019

Путь без Regex:

let allowedChars = "01234567890.,-,+";
let input = "-a123.b45";

let result = Array.from(input).filter(f=> allowedChars.includes(f)).join('');
console.log(result);

Путь с Regex:

let regex = /[^\d.+-]|\.(?=.*\.)/g;
const subst=``;
const str = '+-1,23.456abc';
const result = str.replace(regex, subst);
console.log(result);
1 голос
/ 16 октября 2019

Чтобы удалить все символы, кроме цифр, запятых, точек и дефиса в начале строки , вы можете использовать

text = text.replace(/^(-)|[^0-9.,]+/g, '$1');

См. Демонстрационный пример regex

Подробности

  • ^(-) - начало строки и -, включенные в группу 1
  • | - или
  • [^0-9.,]+ - любые 1+ символов, кроме цифр, . и ,.

Замена - $1, т. Е. Если был ведущий - он останется в результате.

Немного более всеобъемлющее регулярное выражение, которое сохраняет только последнюю неконченную запятую / точку:

text = text.replace(/^(-)|[.,](?=[^.,]*[.,](?!$))|[,.]+$|[^0-9.,]+/g, '$1');

См. это демонстрационное выражение регулярного выражения

Здесь добавлено еще несколько альтернатив:

  • [.,](?=[^.,]*[.,](?!$)) - соответствует . или ,, за которыми следует еще один . или , где-то после 0+ символы, отличные от . и ,
  • [,.]+$ - соответствует любым 1+ запятым / точкам.
0 голосов
/ 16 октября 2019

Это очень многоразовое решение, вам нужно определить функцию, которая:

  • возвращает true, если строка верна
  • возвращает false если строка содержит недопустимый шаблон

Затем мы перебираем строку, используя split и reduce, и давайте решим, что принимать или отклонять, char за char:

const testString = '--123.-34';
const isValid = str => {
   return /^[-]{0,1}\d*(\.|,)?\d*$/.test(str);
};

const cleanString = testString
   .split('')
   .reduce((str, char) => {
     if (isValid(str + char)) {
       return str + char;
     }
     return str;
   }, '');
   
 console.log(cleanString);

Функция isValid может быть изменена без регулярных выражений

0 голосов
/ 16 октября 2019

Другое предложение без регулярных выражений, похожее на ответ StepUp. При этом используется цикл for ... (синтаксис ES6).

const filterChars = (str, allowed) => {
  let newStr = '';
  for (let letter of str) newStr += allowed.includes(letter) ? letter : '';
  return newStr;
}

const result = filterChars('-23a', '-123456...')

console.log(result) // '-23'
0 голосов
/ 16 октября 2019
/^-?[^\d,.]/g/

Здесь мы говорим, что совпадение должно начинаться с нуля или одного раза. После этого за ним может следовать любая последовательность чисел, ',' или '.'

Мне кажется, что вы пытаетесь сопоставить любое и все числа, которые имеют необязательный знак -,и имеют форму 123 456 789,000000. Это регулярное выражение будет правильным для числа в форме, скажем, -123 .... ,,,, 456 ,,, 78., 9, которое, как я полагаю, вам не нужно.

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