Нужно регулярное выражение JavaScript для сумм и десятичных дробей с процентным увеличением - PullRequest
0 голосов
/ 18 июня 2019

У меня пока есть это выражение, ссылка на regex101 здесь :

^? - (. \ Д {1,3})? [+], [0-9] \ {d} 0,6% $

5 (действителен)

5,5 (действует)

+ 5 (действителен)

-6,999 (действительный)

5% (действует, но нуждается в настройке)

Это прекрасно работает, за исключением того, что мне нужно настроить его для принятия процента в конце, только если он начинается с плюса или минуса, все остальное правильно, поэтому: 5% недопустимо, + 5% допустимо, - 5,5% действителен, +5 действителен (процент не требуется для +/-).

спасибо.

Ответы [ 2 ]

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

Попробуйте

^([-+]?\d{1,6}(\.\d{1,3})?|[-+]\d{1,6}(\.\d{1,3})?%)$

Требуется ± 123,12 (без процентов) или 123,12% (с процентами).

5% недействительно,
+ 5% действует,
-5% действует

1 голос
/ 18 июня 2019

Вам нужно будет немного развернуть этот шаблон и использовать чередование:

^(?:[-+]?\d{1,6}(?:\.\d{1,3})?|[-+]\d{1,6}(?:\.\d{1,3})?%)$

См. Демоверсию регулярных выражений и график регулярных выражений :

enter image description here

Детали

  • ^ - начало строки
  • (?: - запуск группы без захвата для хранения чередований
    • [-+]?\d{1,6}(?:\.\d{1,3})? - необязательный + или -, от 1 до 6 цифр и необязательная последовательность . и от 1 до 3 цифр
    • | - или
    • [-+]\d{1,6}(?:\.\d{1,3})?% - + или -, от 1 до 6 цифр и необязательная последовательность из . и от 1 до 3 цифр и % символ
  • ) - конец группы без захвата
  • $ - конец строки.

В JS вам не нужно повторять части регулярного выражения, вы можете построить шаблон динамически:

var num_re = "\\d{1,6}(?:\\.\\d{1,3})?";
var regex = new RegExp("^(?:[-+]?" + num_re + "|[-+]" + num_re + "%)$");
var strs = ['5', '5.5', '+5', '-6.999', '5%', '+5%', '-5.5%'];
for (var s of strs) {
  console.log(s, "=>", regex.test(s));
}

Выход:

5 => true
5.5 => true
+5 => true
-6.999 => true
5% => false
+5% => true
-5.5% => true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...