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