我有一个正则表达式,尽我所能,只允许拉丁字符集选项为“ - ”,如果包括,必须至少跟一个其他拉丁字符。
我的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)
我真正希望发生的是最后两次检查失败 我如何修改它以获得我想要的结果?
答案 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