Строка заменить все, что не Mach регулярное выражение - PullRequest
2 голосов
/ 28 июня 2019

Это мое регулярное выражение javascript: /^(\d+\.?\d{0,2})$/ Моя цель - заменить все входные данные в соответствии с ним. Это возможно? Пример:

123a.12 => 123.12
aaa12aa => 12
12.aaa13 => 12.13
12.aaa => 12
12.555 => 12.55
12.... => 12
12.    => 12
12.35.12.14 => 12.35
12.aaa.2.s.5 => 12.25

Я использовал str.replace(/^(\d+\.?\d{0,2})$/, ''), но безуспешно

Ответы [ 4 ]

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

Один из вариантов для ваших текущих примеров - использовать чередование, чтобы сопоставить либо не цифру, либо точку, либо символ пробела, либо совпадать с точкой, за которой следует 1+ нецифров, и утверждать, что это не заканчивается цифрой.

[^\d.\s]+|\.[^\d]+(?!\d)\b

[
  "123a.12",
  "aaa12aa",
  "12.aaa13",
  "12.aaa "
].forEach(str => console.log(str.replace(/[^\d.\s]+|\.[^\d]+(?!\d)\b/g, '')));

Изменить после обновленного вопроса

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

Сначала замените все не цифры и точки пустым пробелом, используя [^\d.]+

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

^(\d+)(?:\.+|(\.)\.*(\d)\.*(\d).*)$

Regex demo

strings = [
  "123a.12",
  "aaa12aa",
  "12.aaa13",
  "12.aaa",
  "12.555",
  "12....",
  "12.",
  "12.35.12.14",
  "12.aaa.2.s.5"
].map(str => {
  return str
    .replace(/[^\d.]/g, '')
    .replace(/^(\d+)(?:\.+|(\.)\.*(\d)\.*(\d).*)$/, function(m, g1, g2, g3, g4) {
      return undefined !== g2 ? g1 + g2 + g3 + g4 : g1;
    });
});

console.log(strings);
2 голосов
/ 28 июня 2019

Выполните шаги: сначала замените все, что не является числом, затем обрежьте .:

function getNum(input, expected){
  num = input
    .replace(/[^\d.]/g, '')
    .replace(/\.+$/, '')
    .replace(/^\.+/, '');
    
  console.log(input + ' => ' + num + ' | ' + expected)
}

getNum('123a.12', '123.12');
getNum('aaa12aa', '12');
getNum('12.aaa13', '12.13');
getNum('12.aaa', '12');
getNum('abcd.12', '12');
getNum('abcd.efg.12.abcd.efg', '12');
1 голос
/ 28 июня 2019

Вы можете заменить первый . заполнителем, я использовал |.Затем удалите все символы, которые не являются цифрами или заполнителями.Наконец, замените заполнитель на ..Затем удалите что-либо после 2 десятичных знаков:

const num = (s) => {
  const clean = s.replace(".", "|").replace(/[^\d|]/g, '').replace('|', '.');
  
  return parseInt(clean * 100) / 100;
}

const tests = [
  "123a.12",
  "aaa12aa",
  "12.aaa13",
  "12.aaa",
  "12.555",
  "12....",
  "12.",
  "12.35.12.14",
  "12.aaa.2.s.5"
];

tests.forEach(test => console.log(test + " => " + num(test)));
0 голосов
/ 28 июня 2019

Это должно обрабатывать все случаи, если нет двух периодов подряд.

let myString = 'test1.0.test'
myStr.replace(/[^\d.-]/g,'').replace(/[^\d.-]|\.$/g, '')
// 1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...