Javascript 十进制精度的动态正则表达式不起作用

Javascript 十进制精度的动态正则表达式不起作用,javascript,regex,Javascript,Regex,我有以下用于十进制精度和小数位数的硬编码正则表达式,它可以工作(在另一个项目中): 然而,我不想硬编码多个变体。有趣的是,下面的方法失败了……但我不知道为什么 我“认为”连接可能(以某种方式)影响“测试” 我做错了什么 示例: var validationRules = { decimal: { hasPrecision: function (precision, scale, text) { var regex = new RegExp('

我有以下用于十进制精度和小数位数的硬编码正则表达式,它可以工作(在另一个项目中):

然而,我不想硬编码多个变体。有趣的是,下面的方法失败了……但我不知道为什么

我“认为”连接可能(以某种方式)影响“测试”

  • 我做错了什么
示例:

var validationRules = {
    decimal: {
        hasPrecision: function (precision, scale, text) {

            var regex = new RegExp('\d{0,' + precision + '}(\.\d{1,' + scale + '})?$'); 
            var result = regex.test(text);

            // result is ALWAYS true ????
            alert(result);
            alert(regex);
        }
    }
};
失败的示例代码段:

$(文档).ready(函数(){
var验证规则={
十进制:{
hasPrecision:函数(精度、比例、文本){
var regex=new RegExp('\d{0'+precision+'}(\.\d{1'+scale+'})?$);
var结果=正则表达式测试(文本);
警报(结果);
警报(正则表达式);
}
}
};
变量掩码={
十进制:函数(e){
//TODO:让Kendo MaskedTextBox运行正则表达式
var regex=newregexp(“^([0-9\.])$”;
var key=String.fromCharCode(!event.charCode?event.which:event.charCode);
如果(!正则表达式测试(键)){
event.preventDefault();
返回false;
}
}
};
var按钮=$('.btn');
var textbox=$('.txt');
文本框.on('keypress',masks.decimal);
按钮。打开('单击',函数(){
var text=textbox.val();
validationRules.decimal.hasPrecision(2,3,文本);
});
});

在构建动态字符串时,始终查看结果。在您的例子中,您正在构建它,并假设它正在转变为您想要的正则表达式模式

例如,您实际正在构建的是:

d{0,2}(.d{1,3})?$
为什么??因为通过构造函数构建的正则表达式模式(与文本相反)被构建为字符串,而字符串中的
\
被解释为转义字符

然而,您需要这些反斜杠来保持您的模式,所以您需要双重转义。实际上,您需要转义,以便保留最后一个转义

var regex = new RegExp('\\d{0,' + precision + '}(\\.\\d{1,' + scale + '})?$');
假设
精度
比例
包含您认为它们包含的整数,这将产生与硬编码模式等效的结果。也检查一下这个。(例如,如果它们包含浮动,这将破坏您的模式。)

至于误报,这可能是由于缺少起始锚点指令,即
^

/\d{0,2}(\.\d{1,3})?$/.test("1234"); //true
/^\d{0,2}(\.\d{1,3})?$/.test("1234"); //false, note ^
在构建动态字符串时始终查看结果。在您的例子中,您正在构建它,并假设它正在转变为您想要的正则表达式模式

例如,您实际正在构建的是:

d{0,2}(.d{1,3})?$
为什么??因为通过构造函数构建的正则表达式模式(与文本相反)被构建为字符串,而字符串中的
\
被解释为转义字符

然而,您需要这些反斜杠来保持您的模式,所以您需要双重转义。实际上,您需要转义,以便保留最后一个转义

var regex = new RegExp('\\d{0,' + precision + '}(\\.\\d{1,' + scale + '})?$');
假设
精度
比例
包含您认为它们包含的整数,这将产生与硬编码模式等效的结果。也检查一下这个。(例如,如果它们包含浮动,这将破坏您的模式。)

至于误报,这可能是由于缺少起始锚点指令,即
^

/\d{0,2}(\.\d{1,3})?$/.test("1234"); //true
/^\d{0,2}(\.\d{1,3})?$/.test("1234"); //false, note ^

您应该在RegExp:
\\d
内双重转义。它是字符串类型。@revo no…不起作用。但是,谢谢。在纠正这个问题之后,我认为你应该考虑使用<代码> ^ <代码>锚点,或者至少<代码> \b>代码>,同时允许在调用<代码>时允许值如<代码> 123.123 /代码>。HascReCress(2, 3,文本)< /代码>尝试<代码> new ReGEXP(‘^’d { 0,’+精度+}}(\\d{{ 1,‘+St++'})$$’);
您应该在RegExp:
\\d
内双重转义。它是字符串类型。@revo no…不起作用。但是,谢谢。在纠正这个问题之后,我认为你应该考虑使用<代码> ^ <代码>锚点,或者至少<代码> \b>代码>,同时允许在调用<代码>时允许值如<代码> 123.123 /代码>。HascReCress(2, 3,文本)< /代码>尝试<代码> new ReGEXP(‘^’d { 0,’+精度+}}(\\d{{ 1,‘+St++'})$$’);<代码>