使用正则表达式无法正常验证Javascript上的货币

时间:2015-01-19 09:55:33

标签: javascript regex

我需要货币类型的正则表达式。 要求:

1. First char can be a '$'. It can appear either 0 or 1 times.
2. Then a digit can appear multiple times.
3. Then a decimal point can appear either 0 or 1 time.
4. After this, a digit can appear 0 or more times. 

我写了以下正则表达式:

\$?\d+\.?\d*

我需要在JS上测试这个。这就是我在JS上测试它的方法;

var str = "$cng";
var patt = new RegExp('[\$?\d+\.?\d*]');
var res = patt.test(str);
console.log(res);

上面的字符串$ cng返回true。我无法得到它。我在这里遗漏了什么。谁能请帮忙。提前谢谢。

4 个答案:

答案 0 :(得分:1)

  1. 将其传递给具有双引号作为分隔符的RegExp构造函数时,您必须再次转义所有反斜杠。

  2. 我还建议您删除模式周围的方括号。

  3. 所以改变你的模式如下,

    var patt = new RegExp("^\\$?\\d+\\.?\\d*$");
    

    OR

    var patt = new RegExp("^\\$?\\d+(?:\\.\\d+)?$");
    

    示例:

    > var str = "$123.12";
    undefined
    > var patt = new RegExp("^\\$?\\d+(?:\\.\\d+)?$");
    undefined
    > patt.test(str);
    true
    > var patt = new RegExp("^\\$?\\d+(?:\\.\\d+)?$");
    undefined
    > patt.test('$123.12$');
    false
    

答案 1 :(得分:0)

[\$?\d+\.?\d*]==>[] is a character class.

你的正则表达式只会匹配字符类中定义的1 character

使用

^\\$?\\d+\\.?\\d*$

/^\$?\d+\.?\d*$/ 

非常安全。

答案 2 :(得分:0)

RegExp('[\$?\d+\.?\d*]')替换为RegExp(/\$?\d+\.?\d*/),它将按预期工作。

工作代码段:



var str = "$100.10";
var patt = new RegExp(/^\$?\d+\.?\d*$/);
var res = patt.test(str);
console.log(res);




修改

您也可以这样做:var res = /^\$?\d+\.?\d*$/.test(str);

答案 3 :(得分:0)

您的正则表达式也应该匹配字符串的开头和结尾,否则它只会测试字符串是否包含货币:

^\$?\d+\.?\d*$

当您在Javascript中实现它时,您在正则表达式周围添加了括号,这完全改变了含义。如果括号中的任何字符存在于字符串中,则模式将找到匹配项,并且由于字符串中有$,结果为true

此外,当您在字符串中有正则表达式时,您必须转义反斜杠:

var patt = new RegExp('^\\$?\\d+\\.?\\d*$');

您还可以使用正则表达式文字来创建对象:

var patt = /^\$?\d+\.?\d*$/;

您可能希望更改要求,以便仅在小数点后面有数字时允许小数点,以便例如$1.不是有效值:

^\$?\d+(\.\d+)?$