我的正则表达式应该只接受基于拉丁文的字符,但它的行为却很奇怪

My regex that should only accept latin-based characters is acting strangely

本文关键字:字符 我的 拉丁文 正则表达式      更新时间:2023-09-26

我已经尽我所能编写了一个正则表达式,它只允许拉丁字符集带有'-'选项,如果包含该选项,则必须后跟至少一个其他拉丁字符。

我的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)  

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

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

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

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

请参阅regex演示。

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

相关文章: