Разбить число по начальным и конечным нулям - PullRequest
2 голосов
/ 10 января 2020

Я пытаюсь написать регулярное выражение для split, которое будет выглядеть следующим образом:

'4.82359634' -> ['', '4.82359634', '']
'0.82300634' -> ['0.', '82300634', '']
'5.10000000' -> ['', '5.1', '0000000']
'5,10000000' -> ['', '5,1', '0000000'] // Handle commas or dots in middle section
'0.00000274' -> ['0.00000', '274', '']

Вот что я пытался до сих пор, это 2 регулярных выражения и тоже не работают должным образом:

function splitZeros(v) {
  const [leftAndMiddle, right] = v.split(/(0+$)/).filter(Boolean);
  const [left, middle] = leftAndMiddle.split(/(^[0,.]+)/).filter(Boolean)
  console.log({ left, middle, right })
}

// (NOT working properly), comments are desired results.
splitZeros("4.82359634"); // ['', '4.82359634', '']
splitZeros("0.82359634"); // ['0.', '82359634', '']
splitZeros("5.10000000"); // ['', '5.1', '0000000']
splitZeros("5,10000000"); // ['', '5,1', '0000000']
splitZeros("0.00000274"); // ['0.00000', '274', '']

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Вы можете сопоставлять и захватывать детали, используя

/^(0*(?:[.,]0*)?)([\d.,]*?)(0*(?:[.,]0*)?)$/

См. Демонстрационную версию regex .

Подробности

  • ^ - начало строки
  • (0*(?:[.,]0*)?) - Группа 1: ноль или более 0 символов с последующей необязательной последовательностью . или , и затем ноль или более 0 s
  • ([\d.,]*?) - Группа 2: ноль или более цифр, запятых или точек, но как можно меньше из-за ленивого квантификатора *?
  • (0*(?:[.,]0*)?) - Группа 3: ноль или более 0 символов с последующей необязательной последовательностью . или , и затем ноль или более 0 s
  • $ - конец строки.

JS демо:

function splitZeros(v) {
  const [_, left, middle, right] = v.match(/^(0*(?:[.,]0*)?)([\d.,]*?)(0*(?:[.,]0*)?)$/);
  console.log({ left, middle, right })
}

splitZeros("4.82359634"); // ['', '4.82359634', '']
splitZeros("0.82359634"); // ['0.', '82359634', '']
splitZeros("5.10000000"); // ['', '5.1', '0000000']
splitZeros("5,10000000"); // ['', '5,1', '0000000']
splitZeros("0.00000274"); // ['0.00000', '274', '']
1 голос
/ 10 января 2020

Вы можете взять несколько групп и пропустить всю соответствующую строку.

const split = s => s.match(/^([0.,]*)(.*?)(0*)$/).slice(1);

var data = [
    '4.82359634', // ['', '4.82359634', '']
    '0.82359634', // ['0.', '82359634', '']
    '5.10000000', // ['', '5.1', '0000000']
    '5,10000000', // ['', '5,1', '0000000'] // Handle commas or dots in middle section
    '0.00000274', // ['0.00000', '274', '']
];

console.log(data.map(split));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...