【问题标题】:Syntax not understood value.match语法不理解 value.match
【发布时间】:2013-08-27 20:35:20
【问题描述】:

在 javascript 中,我注意到这个我不明白它是如何工作的东西:

function validate_pin(frm)
{
    var piN = document.getElementById('codice');
    if (!piN) {
        var piN = document.getElementById('invio');
    }

    if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/)) {
        // SORRY! WRONG PIN!
        //alert('ATTENZIONE! INSERIRE UN PIN NUMERICO!');
        alert('Attenzione! Codice PIN errato!');
        piN.focus();

        return false;
    }
}

还有字符串if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/))是什么意思?

【问题讨论】:

  • 你搜索过match吗?

标签: javascript string syntax match


【解决方案1】:

pin 是一个 DOM 元素,很可能是一个 HTMLInputElement

pin.value是输入元素的值,是一个字符串。

String.match 将字符串与正则表达式(RegExp object)进行匹配,当没有找到匹配项时返回一个假值。

我还假设您可能不知道该正则表达式的作用,所以解释一下:

  • ^ 锚点匹配字符串的开头,$ 匹配结尾。
  • \d 是一个字符类 [0-9],需要精确匹配 3 次(在第一次测试中)或 4 次(第二次测试)。

因此,您的字符串必须从头到尾正好包含 3 或 4 个数字字符。


旁注:您的代码以这种方式编写会更优化:

if (!/^\d{3,4}$/.test(piN.value)) {}

regexp.test 仅返回一个布尔值,指示字符串是否与模式匹配,而string.match 将在成功时返回匹配数组(强制为true)或null 在未找到匹配时(强制到false)。

因此两者的结果相同,但test 更适合常规模式测试。


另一种选择,不依赖正则表达式:

var pinValue = parseInt(pin.value, 10);
if (pinValue >= 100 && pinValue <= 9999) {}

与以前的正则表达式版本的唯一区别是parseInt 将忽略前导和尾随空格以及尾随无效字符(应该是极端情况)。此选项更具可读性 IMO。您可以选择更适合您的用例的解决方案。

【讨论】:

  • @Bergi 其实我只是想了一些更好的东西,但是谢谢! =]
【解决方案2】:

这里有一个解释:

function validate_pin(frm)
{
    // Get an input element with ID=codice
    var piN = document.getElementById('codice');

    // If there is no such element, get input with ID=invio
    if (!piN) {
        var piN = document.getElementById('invio');
    }

    // If value of this input is NOT a 3- or 4-digit number, alert with an error
    // and return false.
    if (!piN.value.match(/^\d{3}$/) && !piN.value.match(/^\d{4}$/)) {
        // SORRY! WRONG PIN!
        //alert('ATTENZIONE! INSERIRE UN PIN NUMERICO!');
        alert('Attenzione! Codice PIN errato!');
        piN.focus();

        return false;
    }
}

正则表达式/^\d{3}$/ 的意思是:“字符串只有三个数字 (\d),没有其他内容(因为开头是 ^,结尾是 $”。

例如:

  • /^\d{3}$/ 匹配:123,但不匹配 a123123a
  • /\d{3}$/ 匹配:123a123,但不匹配 123a
  • /^\d{3}/ 匹配:123123a,但不匹配 a123

条件:if (!piN.value.match(/^\d{3}$/) &amp;&amp; !piN.value.match(/^\d{4}$/)) 可以写成更短的形式:if (!pIN.value.match(/^\d{3,4}$/))

【讨论】:

  • @user2723065 - 是的,任何数字。所以对于 \d{3} 这意味着 000-999 和对于 \d{4} - 0000-9999。
【解决方案3】:

这是一个正则表达式:) 你检查 pin 的长度是 3 位还是 4 位。 您可以了解更多关于正则表达式here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2023-01-02
    • 2012-05-07
    • 2013-06-22
    • 2013-11-19
    相关资源
    最近更新 更多