我的正则表达式应该只接受基于拉丁语的字符,这种行为很奇怪

时间:2015-11-05 21:06:21

标签: javascript regex

我有一个正则表达式,尽我所能,只允许拉丁字符集选项为“ - ”,如果包括,必须至少跟一个其他拉丁字符。

我的RegEx:

[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+(?:[-]?[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+)

我在阅读了几篇文章后重新阅读了本手册,找出了解决这个问题的最佳方法。此检查附加到文本字段,用户只键入其名字,然后提交。

它运作正常,但肯定有改进的余地。

示例:

Tom         // passes  
Éve         // passes  
John-Paul   // passes  
2pac        // passes and removes numbers (not really what I want)  
John316     // passes and removes numbers (not really what I want)  

我真正希望发生的是最后两次检查失败 我如何修改它以获得我想要的结果?

1 个答案:

答案 0 :(得分:1)

您需要通过在开头添加^并在结尾添加$来锚定正则表达式。这样你就不会在输入字符串中放任何其他符号。

我还建议通过将?从连字符后移到结尾来增强模式(这将使正则表达式执行线性,因为连字符没有量词并且是必需的,因此限制了回溯):

^[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+(?:-[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+)?$

请参阅regex demo

JS片段:



console.log(/^[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+(?:-[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+)?$/.test('Éve')); //=> true
console.log(/^[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+(?:-[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+)?$/.test('John-Paul'));  // => true
console.log(/^[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+(?:-[\u00BF-\u1FFF\u2C00-\uD7FFA-Za-z]+)?$/.test('John316'));  // => false