Javascript 带有扩展拉丁字母的正则表达式(ä;ö;ü;è;ß;)

Javascript 带有扩展拉丁字母的正则表达式(ä;ö;ü;è;ß;),javascript,node.js,regex,utf-8,Javascript,Node.js,Regex,Utf 8,我想在Node.js中做一些基本的字符串测试。假设我有一个表单,用户输入他们的名字,我想检查它是垃圾还是真名 令人高兴的是(或者遗憾的是我的检查)我得到了来自世界各地的用户,这意味着他们的名字包含非英语字符,比如äöüßé。我习惯于使用/[A-Za-z-]{2,}/,但这与“Jan Buschtöns”之类的名称不匹配 我是否必须手动将所有可能的非英语但拉丁语字符添加到正则表达式中才能工作?我不想要一个100多个字符长的正则表达式,比如/[a-Za-z-äääääèèèèèèèèè…]{2,}/

我想在Node.js中做一些基本的字符串测试。假设我有一个表单,用户输入他们的名字,我想检查它是垃圾还是真名

令人高兴的是(或者遗憾的是我的检查)我得到了来自世界各地的用户,这意味着他们的名字包含非英语字符,比如
äöüßé
。我习惯于使用
/[A-Za-z-]{2,}/
,但这与
“Jan Buschtöns”
之类的名称不匹配

我是否必须手动将所有可能的非英语但拉丁语字符添加到正则表达式中才能工作?我不想要一个100多个字符长的正则表达式,比如
/[a-Za-z-äääääèèèèèèèèè…]{2,}/
检查并

如果要包含unicode,则需要使用
\p{L}
匹配任何字母字符

说到unicode,
\w
的替代方案是
[\p{L}\p{N}}}

更新:从ES2018开始,JavaScript支持unicode属性转义,如
\p{L}
,它匹配unicode认为是字母的任何内容。所有现代浏览器都支持这一功能,所以只要你不在乎古代的浏览器,这可能就是最好的选择

针对ES2018之前浏览器的旧答案

答案完全取决于你想做什么

正如您所注意到的,
[A-Za-z]
只匹配拉丁字母,而不匹配变音符号

如果你只关心德语的变音符号和连字,那么你可以用
[A-Za-zÄÜÜäß]
替换该部分,例如:

/[A-Za-zÄÖÜäöüß -]{2,}/
但这可能不是你想做的。您可能希望将拉丁字母与任何发音符号匹配,而不仅仅是德语中使用的发音符号。或者你想匹配任何字母表中的任何字母,而不仅仅是拉丁字母

其他正则表达式方言有字符类来帮助您解决此类问题,但不幸的是,JavaScript的正则表达式方言只有很少的字符类,在这里它们都没有帮助您

(如果您不知道,“字符类”是一个表达式,它匹配预定义字符组中的任何字符。例如,
\w
是匹配任何ASCII字母、数字或下划线的字符类,
是匹配任何字符的字符类。)

这意味着您必须列出与要匹配的字符对应的每个UTF-16代码单元范围

一个快速而肮脏的解决方案可能是说
[A-zA-Z\u0080-\uFFFF]
,或者完整地说:

/[A-Za-z\\u0080-\\uFFFF -]{2,}/
这将匹配ASCII范围内的任何字母,但也将匹配ASCII范围外的任何字符。这包括任何脚本中所有可能的带或不带变音符号的字母字符。但是,它也包含许多非字母的字符。不包括ASCII范围内的非字母,但包括ASCII范围外的非字母


对于您的目的来说,上面的内容可能已经足够好了,但如果不是这样,则您必须找出需要的字符范围,并明确指定这些字符范围。

/\w+/
这样的技巧不起作用。他们也只匹配英文字符。如果你找到一个叫萨利什名字的人会怎么样?使用
7
作为字母,例如“S”ḵwx̱wú7mesh”;还有一个不那么晦涩的问题,韩国人、日本人、中国人。。。你可能也需要阅读。我基本上是建议你根本不用费心检查。我已经考虑过亚洲语和基里尔语了。他们可以使用拉丁语。而且。。。萨利什是一个非常罕见的病例d您能用
\p{L}
?@MendiSterenfeld显示一个正则表达式的相关示例吗?请参见示例