регулярное выражение для проверки шаблона - PullRequest
2 голосов
/ 19 июня 2020
• 1000

Примеры:

400k - shorthand, 

400.2k - shorthand, 

4m - shorthand,

500. - should work

500000 - full amount

некоторому пользователю шаблона не должно быть разрешено вводить пример:

4.2.k, 

.3k, 

4...k

300.k

Я написал регулярное выражение, которое находится ниже, но оно позволяет чтобы ввести точку после числа.

textValue.match(/^[0-9]*(\.[0-9]{0,2})*([0-9km]{1})$/) && textValue.match(/^[\d]+/)

приведенный выше код первое регулярное выражение проверяет шаблон, а второе регулярное выражение заставляет пользователя вводить число, потому что сумма не может начинаться со строки, я написал два отдельных регулярных выражения, так как я не понимаю, как чтобы поместить их в одно регулярное выражение, и это регулярное выражение не принимает точку после числа. Кто-нибудь может дать идеальное регулярное выражение для проверки вышеуказанного шаблона в одном регулярном выражении ??

Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

С чередованием (никогда не самым красивым) это можно сделать так:

^\d+([km]|\.|\.\d+[km])?$

См. Онлайн-демо

  • ^ - Начать string ancor.
  • d+ - Одна или несколько цифр.
  • ( - Открытие группы захвата (вы можете использовать без захвата).
    • [km] - одиночный символ «k» или «m».
    • | - чередование (OR).
    • \.? - буквальная точка.
    • | - Чередование (ИЛИ).
    • \.\d+[km] - Буквальная точка, за которой следует хотя бы один di git и символ «k» или «m».
    • )? - Закройте группу захвата и сделайте ее необязательной
  • $ - Начало привязки строки.

enter image description here

1 голос
/ 19 июня 2020

Вы можете попробовать:

^\d+\.?(?:\d+)?[KkMm]?(?<!\.[KkMm])$

Объяснение приведенного выше регулярного выражения:

^, $ - совпадение начинается и конец строки соответственно.

\d+ - соответствует цифрам 1 или более раз.

\.? - представляет 0 или 1 вхождение of ..

[KkMm]? - Соответствует необязательным символам из указанного класса символов.

(?<!\.[KkMm]) - Представляет отрицательный вид -за несоответствием символа a после ..

Вы можете найти демонстрацию вышеуказанного регулярного выражения в здесь.

image

const regex = /^\d+\.?(?:\d+)?[KkMm]?(?<!\.[KkMm])$/gm;
const str = `400K
4.2.K
4.3K
3.2M
300000
4....K
4K
500.
300.K`;
let m;

while ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`${match}`);
    });
}

2-е эффективное решение с использованием чередования:

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

^\d+(?:\.$|\.\d+)?[KkMm]?$

Объяснение приведенного выше регулярного выражения:

^, $ - соответствует началу и концу строки соответственно.

\d+ - соответствует цифрам 1 или больше раз.

(?:\.$|\.\d+)? - представляет группу без захвата; соответствие либо чисел, за которыми следуют только . или десятичные числа.

[KkMm]? - соответствует одному из упомянутых символов ноль или 1 раз.

Вы можете найти демонстрацию вышеуказанного регулярного выражения в здесь.

image

const regex = /^\d+(?:\.$|\.\d+)?[KkMm]?$/gm;
const str = `400K
4.2.K
4.3K
3.2M
300000
4....K
4K
500.
300.K`;
let m;

while ((m = regex.exec(str)) !== null) {
// The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
    console.log(`${match}`);
   });
}

1 голос
/ 19 июня 2020

О шаблоне, который вы пробовали

Обратите внимание, что {1} вам не нужен. Класс символов [0-9km] соответствует 1 из char k или m или di git 0-9. Таким образом, возможные цифры для сопоставления могут быть 0-3 вместо 0-2.

Использование квантификатора * для группы позволяет также сопоставить 400.25.22.22.22k


Вы можете использовать этот шаблон для проверки примеров. [0-9]+ в начале шаблона гарантирует, что должен быть хотя бы один di git.

Если вы хотите разрешить 500., вы можете использовать:

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

Пояснение

  • ^ Начало строки
  • [0-9]+ Соответствие 1+ цифр
  • (?: Без захвата группа
    • (?:\.[0-9]{1,2})? Сопоставьте необязательную десятичную часть с 2 цифрами
    • [km]? Сопоставьте необязательно k или m
    • | Или
    • \. Соответствует одной точке
  • )$ Конец строки

Демонстрация регулярных выражений

let pattern = /^[0-9]+(?:(?:\.[0-9]{1,2})?[km]?|\.)$/;
[
  "400k",
  "400.2k",
  "4m",
  "500000",
  "500.",
  "300.k",
  "4.2.k",
  ".3k",
  "4...k",
].forEach(s => console.log(s + " --> " + pattern.test(s)));

Другой вариант - сопоставить точку, только если за ней не следует k или m

^[0-9]+(?:\.(?![km]))?\d*[km]?$

Регулярное выражение

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