RegEx扩展拉丁字母(äöüèß)

bus*_*ens 11 javascript regex utf-8 node.js

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

令人高兴的(或者可悲的是我的支票)我从世界各地获得用户,这意味着他们的名字包含非英文字符,例如ä ö ü ß é.我习惯使用,/[A-Za-z -]{2,}/但这与名字不匹配"Jan Buschtöns".

我是否必须手动将每个可能的非英语但拉丁字符添加到我的RegEx才能工作?我不希望RegEx喜欢100多个字符/[A-Za-z -äöüÄÖÜßéÉèÈêÊ...]{2,}/.

Ωme*_*ega 8

查看http://www.regular-expressions.info/unicode.htmlhttp://xregexp.com/plugins/

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

说到unicode的,替代\w[\p{L}\p{N}_]则.

  • 您能否展示一个带有“\p{L}”的正则表达式的相关示例? (2认同)
  • @outtacomfort - `\w` 的替代方案是 `[\p{L}\p{N}_]`(字母、数字和下划线字符)。将 `\p{N}` 替换为 `\p{Nd}`,将排除字母数字(例如罗马数字),但由于 `\p{L}` 已经包含这些字母,因此排除它们是没有意义的来自`\p{N}`,因为最终它们无论如何都是集合的一部分。 (2认同)

Dan*_*idy 7

更新从 ES2018 开始,JavaScript 支持 Unicode 属性转义,例如\p{L},它匹配任何 Unicode 认为是字母的东西。所有现代浏览器都支持此功能,因此只要您不关心古代浏览器,这可能是可行的方法。

ES2018 之前的浏览器的旧答案

答案完全取决于您想要做什么。

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

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

/[A-Za-zÄÖÜäöüß -]{2,}/
Run Code Online (Sandbox Code Playgroud)

但这可能不是您想要做的。您可能希望将拉丁字母与任何变音符号相匹配,而不仅仅是德语中使用的那些。或者,您可能想匹配任何字母表中的任何字母,而不仅仅是拉丁字母。

其他正则表达式方言有字符类可以帮助您解决此类问题,但不幸的是,JavaScript 的正则表达式方言字符类很少,并且没有一个可以帮助您。

(如果您不知道,“字符类”是一种与属于预定义字符组成员的任何字符相匹配的表达式。例如,\w是与任何 ASCII 字母、数字或下划线,并且.是匹配任何字符的字符类。)

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

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

/[A-Za-z\\u0080-\\uFFFF -]{2,}/
Run Code Online (Sandbox Code Playgroud)

这将匹配 ASCII 范围内的任何字母,但也会匹配 ASCII 范围之外的任何字符。这包括任何脚本中带有或不带有变音符号的所有可能的字母字符。但是,它还包括许多不是字母的字符。ASCII 范围内的非字母被排除,但包括 ASCII 范围之外的非字母。

上面的内容可能足以满足您的目的,但如果不是,那么您将必须弄清楚您需要哪些字符范围并明确指定这些范围。


小智 7

如果您需要拉丁字母,包括那些不太常见的变音符号,例如\xc3\xa5\xc4\x93\xc4\xaf,但不包括中文、梵文和西里尔字符,则可以\\p{Script=Latin}u标志一起使用。此功能称为Unicode 属性转义,在 ES2018 中引入。

\n

例如,/\\p{Script=Latin}+/u将匹配仅包含拉丁字符的单词。

\n