正则表达式匹配允许某些特殊字符的美国城市

时间:2017-05-09 14:46:22

标签: regex validation

我正在研究一个有效的美国城市名称。我的要求如下:

  • 只能是25个字符
  • 只能接受字母字符和以下特殊字符:',.-
  • 应使用St. Clou$$, Prai!@rie, $t. Thomas评估 false

  • 应使用O'John, St. Cloud, Cov d'Aline, Milt-Freeman评估 true

这是我到目前为止的表达方式: /(^|\s)[a-zA-Z',.\s-]{1,25}(?=\s|$)((?!\W)[a-zA-Z',.\s-]{1,25}(?=\s|$))?/g

以下是我的测试方法:

let regex = /(^|\s)[a-zA-Z',.-\s]{1,25}(?=\s|$)((?!\W)[a-zA-Z',.-\s]{1,25}(?=\s|$))?/g;
let str = "St. Clou$$";
let validation = regex.test(str)
if(validation){
    return true 
} else { 
    return false }

使用上面的测试,正则表达式似乎传递了所有真实条件,但我的测试也返回true St. Clou$$$t. Thomas。似乎当有多个单词并且其中一个单词具有不可接受的特殊字符时,它仍然会通过。

我可以添加什么来使表达式对于上面提到的所有错误条件都返回false?有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:1)

尝试

^[a-zA-Z',.\s-]{1,25}$

匹配1-25个允许的字符,匹配字符串^的开头和结束$。另请注意,我将-放在字符类的末尾,因为它定义了一系列字符。

这是一个使用JS的插图:

var re = /^[a-zA-Z',.\s-]{1,25}$/g,
    data = ['St. Clou$$', 'New York', 'Prai!@rie', 'Houston', '$t. Thomas', 'Chicago'];

data.forEach(function(city) {

  document.write(city + '=');

  if(re.test(city)) {
    document.write('true<br>');
  } else {
    document.write('false<br>');
  }
});

Check it out here at regex101