【问题标题】:Some parts of my regular expression not working我的正则表达式的某些部分不起作用
【发布时间】:2017-05-15 13:35:39
【问题描述】:

我正在尝试使用正则表达式来验证文本框上的输入

表达式应该只允许数字,最多两位小数,最多一位逗号 (,) 和数字前面的一个减号(可选)。

有效:

  • 0,25
  • 10,2
  • -7000
  • -175,33
  • 15555555555555,99

无效:

  • 9,999
  • 15.03
  • 77,77,77

我正在使用^[-+]?[\d ]+(,\d{0,2})?$ 正则表达式用于 Jquery 代码中以防止用户输入无效数字(event.preventDefault()):

    $("input[name*='TB_mytbx']").on('keypress', function (event) {
        var regex = new RegExp("^[-+]?[\d ]+(,\d{0,2})?$", "g");
        var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
        if (!regex.test(key)) {
            event.preventDefault();
            return false;
        }
    });

似乎只有一部分正则表达式有效。

它适用于数字(它不允许我输入字母),但它也不允许逗号 (,) 和减号 (-)。

我做错了什么?

编辑

在我使用之前:

    if (focused.val().indexOf(',') != -1) {
    var number = (focused.val().split(','));
    if (number[1] && number[1].length >= 2) {
        event.preventDefault();
        return;
    }

但这会产生烦人的行为。一旦您输入了一个两位数的数字,您就无法再进行编辑。例如:您不能将 200,50 更改为 300,50 或 100 300,50。 (你明白了)。我希望正则表达式可以以某种方式改变它。

【问题讨论】:

  • 我认为您将正则表达式过度复杂化了。这应该足够了:^-?\d+(,\d\d)?$
  • 并且始终在字符串模式中使用双重转义 \。或者使用正则表达式文字符号/.../。并且在使用带有RegExp#test 的模式时不要使用g 修饰符。
  • 您正在测试按下的键而不是输入的值。
  • @DouwedeHaan 是的。防止用户进入。检查jquery代码。
  • @Enrico 是的,但是您在最后一个按下的字符而不是整个输入值上测试您的正则表达式,这样,它不会让您输入 - 是正常的,因为它会永远不满足正则表达式,它也需要一个数字(你需要一个特殊的测试让用户输入 - 首先在输入上测试你的整个正则表达式)

标签: javascript jquery regex


【解决方案1】:

我认为您将正则表达式过度复杂化了。这应该足够了:

^-?\d+(,\d\d)?$
  • ^ 行首,
  • -? 可选减号,
  • \d+后面是一堆数字,
  • (,\d\d)? 后跟一个逗号和 2 位数字,都是 3 位可选的。
    (替代:(,\d{2})?
  • $ 行尾。

var regex = /^-?\d+(,\d\d)?$/;

console.log(regex.test('0,25'));
console.log(regex.test('-175,33'));
console.log(regex.test('15555555555555,99'));

console.log(regex.test('9,999'));
console.log(regex.test('15.03'));
console.log(regex.test('77,77,77'));

你有一个正则表达式来验证输入值。
现在,该代码块可以替换为:

$("input[name*='TB_mytbx']").on('keypress', function (event) {
    var regex = /^-?\d+(,\d\d)?$/;
    var value = $(this).val();  // Use the field's value, instead of the pressed key.

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

【讨论】:

  • (,\d\d)? 部分写成(,\d{2}) 不是更好吗?
  • 简单而优雅的正则表达式模式,很棒的一个^^
  • @chsdk:定义“更好”。在这种特定情况下,\d\d\d{2} 短 1 个字符。两者都是有效的方法。不过,我认为\d\d 在眼睛上稍微容易一些。
  • @Cerbrus 它不会从您的正则表达式中提取任何东西(这很棒),只是一个优化,也许是为了可读性:) 但不要误会我的意思,它值得 +1。
  • @chsdk:我的意思是“优化”是旁观者的眼中的这个。 (除非{2} 实际上更快?不知道......)
【解决方案2】:

对于那些想知道的人,我使用此代码解决了它

        $("input[name*='mythingy']").on('keypress', function (event) {
        var theEvent = event || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode(key);
        var value = this.value;
        var value = value.replace(value.substring(theEvent.currentTarget.selectionStart, theEvent.currentTarget.selectionEnd), "");
        value = [value.slice(0, theEvent.currentTarget.selectionStart), key, value.slice(theEvent.currentTarget.selectionStart)].join('');
        var regex = /^[-+]?([\d ]+(,\d{0,2})?)?$/;
        if (!regex.test(value)) {
            theEvent.returnValue = false;
            if (theEvent.preventDefault) theEvent.preventDefault();
        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多