需要javascript正则表达式来获取数量和百分比增加的小数

时间:2019-06-17 22:06:57

标签: javascript regex

到目前为止,我有这个表达式,请链接到regex101 here

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

5(有效)

5.5(有效)

+5(有效)

-6.999(有效)

5%(有效,但需要调整)

它很好用,只是我需要对其进行调整以仅在以加号或减号开头的结尾处接受一个百分比,其他所有内容都是正确的,因此:5%无效,+ 5%有效,- 5.5%有效,+ 5有效(+/-不需要百分比)。

谢谢。

2 个答案:

答案 0 :(得分:2)

尝试

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

这需要±123.12(无百分比)或123.12%(有百分比)。

5%无效,
+ 5%有效,
-5%有效

答案 1 :(得分:1)

您将不得不解开此模式并使用交替:

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

请参见regex demoregex graph

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