我需要货币类型的正则表达式。 要求:
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。我无法得到它。我在这里遗漏了什么。谁能请帮忙。提前谢谢。
答案 0 :(得分:1)
将其传递给具有双引号作为分隔符的RegExp构造函数时,您必须再次转义所有反斜杠。
我还建议您删除模式周围的方括号。
所以改变你的模式如下,
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+)?$