Отмените шаблон регулярного выражения десятичного числа, чтобы лишить его замены - PullRequest
2 голосов
/ 29 июня 2019

Я пытаюсь заменить все символы, которые не соответствуют заданному шаблону регулярных выражений.Хотя он работает для соответствия, я не могу заставить шаблоны регулярных выражений, состоящие из нескольких частей, работать с отрицаниями.

[^\d.-] работает нормально, в смысле удаления всех нечисловых и .- символов, но это все еще неЭто не достаточно для десятичного числа, поэтому я сделал следующий шаблон:

^[0-9]+(.[0-9]{1,2})?$

Однако я не знаю, как отрицать это, чтобы заставить его работать в .replace.Есть идеи?Я предполагаю, что то же самое будет применяться ко всем другим шаблонам, например: ^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}$

Спасибо!

Пример входных данных, которые действительны для десятичного числа:

1.1
1.00
1.23
23123981239.2
2
-1

Пример замены:

1.a4 => 1.4
44.44.4 => 44.444
qweqwe55.3 => 55.3

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вы можете сделать это с помощью split / join. Разделителем будет шаблон: ^.*?(-?\d+(?:\.\d+)?)|\D+.

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

Вторая часть соответствует всем не цифрам.

Тогда вам нужно только объединить результат с пустой строкой.

let strings = [
  "1.a4",
  "44.44.4",
  "qweqwe55.3",
  "44.44.4.4.3333.5",
  "-44.44.4.4.3333.5",
  "-44.44.4.4.3333.5-",
  "1.1",
  "1.00",
  "1.23",
  "23123981239.2",
  "2",
  "-1",
].map(str => str.split(/^.*?(-?\d+(?:\.\d+)?)|\D+/).join('') );

console.log(strings)
1 голос
/ 29 июня 2019

Возможно, одним из вариантов может быть использование замена и использование функции обратного вызова.

Сначала замените все не точки, цифры и дефисы /[^\d.-] пустой строкой.

Затем сопоставьте необязательный дефис, 1+ цифры и точку в группе 1. В группе 2 сопоставьте 0+ раз любому символу, кроме новой строки.

(-?\d+\.)(.*)

Regex demo

В обратном вызове вернуть объединение групп 1 и 2, где в группе 2 все нецифровые символы заменяются пустой строкой.

let strings = [
  "1.a4",
  "44.44.4",
  "qweqwe55.3",
  "44.44.4.4.3333.5",
  "-44.44.4.4.3333.5",
  "-44.44.4.4.3333.5-",
  "1.1",
  "1.00",
  "1.23",
  "23123981239.2",
  "2",
  "-1",
].map(str => {
  return str
    .replace(/[^\d.-]+/, '')
    .replace(/(-?\d+\.)(.*)/, function(m, g1, g2) {
      return g1 + g2.replace(/\D+/g, '');
    });
});

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