我正在研究一个有效的美国城市名称。我的要求如下:
',.-
。应使用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?有什么想法吗?谢谢。
答案 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>');
}
});