使用正则表达式验证加拿大邮政编码

13

我写了一个使用正则表达式验证加拿大邮政编码的JavaScript。

然而,它似乎不起作用:

JavaScript

if语句:

if (myform.zip.value == "" || myform.zip.value == null || myform.zip.value == "Postal Code" || myform.zip.value.length < 12 ) {
    alert("Please fill in field Postal Code. You should only enter 7 characters");
    myform.zip.focus();
    return false;
}

函数:

function okNumber(myform) {
  var regex = /^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$/;
  if (regex.test(myform.zip.value) == false) {
    alert("Input Valid Postal Code");
    myform.zip.focus();
    return false;
  }

  return true;
}

问题

尽管代码正在执行,但它根本不起作用。 运行时,我收到以下消息:

请填写邮政编码字段。您应该只输入7个字符。

一个有效的邮政编码示例为T2X 1V4


{1} 这个表示法毫无意义。一个 [] 字符类已经隐含了 {1}\d 和其它匹配单一字符的元字符也是如此。除此之外,这段代码为什么不能正常工作呢?你确定输入没有前导或结尾的空白符吗? - Marc B
2
什么是有效的加拿大邮政编码规则?这个正则表达式在哪些测试输入上失败了? - Li-aung Yip
我在第一个代码块中没有看到okNumber被调用... 这段代码是否正在执行? - kad81
8个回答

8

这适用于所有加拿大邮政编码..

^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$

4
使用正则表达式可以验证加拿大邮政编码格式,但这并不能保证该邮政编码实际存在

例如:A9A 0A0看起来像一个有效的加拿大邮政编码,但前向排序区域A9A实际上不存在

您确定不想对官方邮政编码清单进行某种查询吗?

3
在这种情况下,类似于 ^[A-Z]\d[A-Z][ ]?\d[A-Z]\d$ 的东西将会有效。如果这个正则表达式在你的程序中不起作用,可能是因为有逻辑错误(真变成了假?),调用正则表达式代码时出错,或者根本没有调用它。 - Li-aung Yip

3
以下是规则:http://en.wikipedia.org/wiki/Postal_code#Reserved_characters
ABCEGHJKLMNPRSTVXY <-- letter used 
DFIOQU <-- letters not used because it mixes up the reader
WZ     <-- letters used but not in the first letter
With that in mind the following in the proper regex

@[ABCEGHJKLMNPRSTVXY][0-9][ABCEGHJKLMNPRSTVWXYZ][\s][0-9][ABCEGHJKLMNPRSTVWXYZ][0-9]

1
这是我使用的加拿大邮政编码有效表达式。它将严格格式化为A0A 0A0。
/^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/

1
第一个错误在于您最初的if语句中的最后一个条件。myform.zip.value.length < 12应该始终为真,因此您的代码的这一部分将始终警报消息"Please fill in field Postal Code. You should only enter 7 characters"并将焦点返回到zip字段。由于有效的邮政编码最多只有7个字符,因此应更改为myform.zip.value.length > 7
在进行了这个更正之后,您在评论中提供的邮政编码T2X 1V4是有效的。但是,您使用的正则表达式可以简化(如评论中所述)。您可以删除所有实例{1},因为它们是冗余的。您可能还想用?而不是*跟随空格。 ?表示前一个字符或表达式可以出现0次或1次,而*表示它可以出现0次或更多次。我认为您希望您的邮政编码中最多只有一个空格。
以下是我测试过的完整工作代码:
<!doctype html>
<html>
<head>
    <title>JavaScript Regex Tester</title>
    <meta charset="utf-8">
    <script>
        function validate(myform) {
            if (myform.zip.value == "" || myform.zip.value == null || myform.zip.value == "Postal Code" || myform.zip.value.length > 7 ) {
                alert("Please fill in field Postal Code. You should only enter 7 characters");
                myform.zip.focus();
                return false;
            }

            return okNumber(myform);
        }

        function okNumber(myform) {
            var regex = /^[ABCEGHJKLMNPRSTVXY]\d[A-Z] *\d[A-Z]\d$/;
            if (regex.test(myform.zip.value) == false) {
                alert("Input Valid Postal Code");
                myform.zip.focus();
                return false;
            }

            return true;
        }
    </script>
</head>
<body>
    <form action="#" name="myform" method="post">
        <input type="text" name="zip" value="Postal Code" />
        <input type="button" value="Submit" onclick="validate(document.myform);"/>
    </form>
</body>
</html>

最后一点,通常在正则表达式中看到[A-Z]时,值得考虑是否应该使用[A-Za-z]来接受大写或小写字母。我不知道这是否适用于加拿大邮政编码,但通常情况下,大多数表单都应该接受任何输入并根据需要更正大小写。

0

这是您问题的解决方案,希望能对您有所帮助。谢谢您的时间。

string[] inputName = new string[5];
    string[] inputId = new string[5];
    string[] inputMarks = new string[5];

    Regex StudentId = new Regex(@"\d\d\d\d\d$");
    Regex Marks = new Regex(@"\d\d$");
    Regex StudentName = new Regex(@"^([a-zA-z\s]{5,10})$");

    private void btnClear_Click(object sender, EventArgs e)
    {
        rtShowAll.Clear();

    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        string Name = txtLastName.Text;
        string id = txtStudentId.Text;
        string marks = txtMarks.Text;

        if ((Name == "") || (!StudentName.IsMatch(Name)))
        {
            MessageBox.Show("space cannot be empty and enter valid characters only");
        }

        else if (Name != "")
        {
            if ((id == null) || (StudentId.IsMatch(id)))
            {
                MessageBox.Show("Enter valid id");
            }
            else if ((id != null) || (StudentId.IsMatch(id)))
            {
                if ((marks == null) || (!Marks.IsMatch(marks)))
                {
                    MessageBox.Show("enter valid marks");
                }

                else if ((marks != null) || (Marks.IsMatch(marks)))
                {
                    for (int i = 0; i <= 5; i++)
                    {
                        inputName[i] = Name;
                        inputId[i] = id;
                        inputMarks[i] = marks;
                        break;
                    }
                }

            }
        }
        txtLastName.Clear();
        txtMarks.Clear();
        txtStudentId.Clear();

    }

    private void btnShowAll_Click(object sender, EventArgs e)
    {


        string result = "";
        for (int i = 0; i <= 5; i++)
        {
            result = inputName[i] + "   " + inputId[i] + "   " + inputMarks[i];
            rtShowAll.Text = result;
            break;
        }

       //list.Add(rtShowAll.Text);
        //string Showall = "";
       // foreach (string s in list)
      // {
       //    Showall += s + " "+ "\n";
        //}
       // rtShowAll.Text = Showall;
    }

    private void btnSearch_Click(object sender, EventArgs e)
    {
        string searchId = txtStudentId.Text;
        string result = "";

        txtStudentId.Text = searchId;

        for (int i = 0; i < 5; i++)
        {
            if (searchId == inputId[i])
            {
                result = inputName[i] + "    " + inputMarks[i];
                rtSearch.Text = result;
            }
            else if (searchId != inputId[i])
            {
                MessageBox.Show("Enter valid Student id");
            }
        }
    }

    private void btnModify_Click(object sender, EventArgs e)
    {
        string id = txtStudentId.Text;
        string newmarks = "";

        for (int i = 0; i < 5; i++)
        {
            if (id == inputId[i])
            {
                newmarks = txtMarks.Text;
                if ((newmarks == null) || (!Marks.IsMatch(newmarks)))
                {
                    MessageBox.Show("enter valid marks");
                }
                else if ((newmarks != null || (Marks.IsMatch(newmarks))))
                {
                    inputMarks[i] = newmarks;
                    MessageBox.Show("marks has been modified");
                }
            }
        }
    }
}

}


1
请解释您为 OP 编写的代码。 - aydow

0
这个可以用来处理加拿大邮政编码:
/^[a-z][0-9][a-z][- ]?[0-9][a-z][0-9]$/i

它将允许使用空格或连字符的正确 X#X #X# 格式。


0

工作演示

For an example of validation in HTML try below.

function validate(zipInput) {
   var isValid = hasMinimumInput(zipInput) && okNumber(zipInput);
   indicate(isValid);
}

function hasMinimumInput(zipInput) {
  if (zipInput.value == ""
   || zipInput.value == null
   || zipInput.value == "Postal Code"
   || zipInput.value.length < 7 ) { // 7 instead 12 as min
   
      alert("Please fill in field Postal Code. You should only enter 7 characters");
      zipInput.focus();
      return false;
  }
  
  return true;
}

function okNumber(zipInput) {
  var regex = /^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$/;
  if (regex.test(zipInput.value) == false) {
  
    alert("Input Valid Postal Code");
    zipInput.focus();
    return false;
  }

  return true;
}

function indicate(isValid) {
   document.getElementById("indicateValid").style.display = isValid ? "inline" : "none";
   document.getElementById("indicateInvalid").style.display = isValid ? "none" : "inline";
}
<h1>Canadian Postal Code</h1>
<form name="myform" onSubmit="validate(this.zip); return false;">
  Postal Code: <input type=text" name="zip"></input>
  <button type="submit">Validate</button>
  
  <span style="color:green;" id="indicateValid">valid</span>
  <span style="color:red;" id="indicateInvalid">invalid</span>
  <br/>valid Example: <code>T2X 1V4</code>
</form>

(Note: real submission is disabled by return false;)

问题

如同Bill the Lizard的回答所述:

  • if条件测试的最小长度应为7而非12

已修复:

  if (zipInput.value == ""
   || zipInput.value == null
   || zipInput.value == "Postal Code"
   || zipInput.value.length < 7 ) { // not 12 as min
   
      alert("Please fill in field Postal Code. You should only enter 7 characters");
      zipInput.focus();
      return false;
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接