javascript - 小数精度的动态正则表达式不起作用

标签 javascript regex

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

// This would be a Decimal(2,3)
var regex = /\d{0,2}(\.\d{1,3})?$/;
var result = regex.test(text);

但是,我不想对多个变体进行硬编码。而且,有趣的是,以下失败了......但我不知道为什么。

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

  • 我在这里做错了什么?

示例:

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);
        }
    }
};

失败示例片段:

$(document).ready(function () {

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

                        alert(result);
                        alert(regex);
                    }
                }
            };

            var masks = {
                decimal: function (e) {

                    // TODO: get Kendo MaskedTextBox to run RegEx
                    var regex = new RegExp("^([0-9\.])$");
                    var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);

                    if (!regex.test(key)) {
                        event.preventDefault();
                        return false;
                    }
                }
            };

            var button = $('.btn');
            var textbox = $('.txt');

            textbox.on('keypress', masks.decimal);
            button.on('click', function () {
                var text = textbox.val();

                validationRules.decimal.hasPrecision(2, 3, text);
            });
        });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" value="1111" class="txt">
<input type="button" class="btn" value="Run it">

最佳答案

在构建动态字符串时始终查看结果。在您的情况下,您正在构建它并假设它正在变成您想要的 REGEX 模式。

例如,您实际构建的是:

d{0,2}(.d{1,3})?$
为什么?因为通过构造函数构建的 REGEX 模式(而不是文字)被构建为字符串 - 并且在字符串中 \ 被解释为转义字符。

但是,您需要这些反斜杠来坚持您的模式,因此您需要双重转义。实际上,您需要转义转义,以便保留最后一个转义。

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

这将产生与您的硬编码模式等效的结果,假设精度scale包含您认为它们包含的整数。也检查一下这个。 (例如,如果它们包含 float ,这将破坏您的模式。)

至于您的误报,这可能是由于缺少启动 anchor 指令,即 ^

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

关于javascript - 小数精度的动态正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49365121/

相关文章:

regex - Perl 正则表达式匹配和删除

javascript - 正则表达式 - 意外的量词

javascript - 填写非文本类型的输入字段,并在 CasperJS 中触发事件

javascript - NetSuite 搜索返回 0 个结果

javascript - 为什么 vue.js 中的 watch 会差一格?

javascript - 验证 xs :duration using a regular expression in Javascript

php - REGEX 如何重复提取模式?

javascript - 互联网浏览器 : "console is not defined" Error

javascript - jQuery show div to all browsers opened on click

ruby-on-rails - Ruby:从字符串中提取单词