JavaScript 中的正则表达式:包括一个 Unicode 组并排除另一个

RegExp in JavaScript: include one Unicode group and exclude another one

我必须写一些正则表达式。我知道哪里有很多变体。但是发现有不懂的地方,所以想请教一下。

我有这个正则表达式: /^[\p{Letter} \-'`’–]+$/u 它必须允许拉丁语和 Ü、Æ 等符号。

它有错误 - 它也允许乌克兰语(西里尔文)符号“і Ї”。 所以我想添加规则“排除西里尔字母”。但是我不知道怎么做。

我试过 /^[\p{Letter} \-'`’–][^\p{sc=Cyrillic}]+$/u; 但最后一部分 [^] 表示除西里尔字母以外的所有字母 ((

请不要让我重写正则表达式。我只想学习如何编写“排除”规则。

谢谢)

在您的 /^[\p{Letter} \-'`’–]+$/u 正则表达式中,\p{Letter} 匹配 Unicode table 中的任何字母。但是,\p{Alphabetic} 包含更多字母,如果您打算匹配任何 Unicode 字母,您会希望使用此 Unicode 类别 class。

因为您只想匹配拉丁字母,您应该将 \p{Letter} 替换为 \p{sc=Latin}\p{sc=Latn}(请注意连字符应该只用在字符 [=50 的末尾) =], 在这里使用是最干净的方式).

请注意,sc=Script=(这是用于脚本名称,scx=Script_Extensions= 可用于脚本扩展)前缀才能正常工作使用 Unicode 类别 classes 中的那些脚本名称(参见 ECMAScript reference)。

查看 JavaScript 演示:

const rx = /^[\p{sc=Latn} '`’–-]+$/u;
console.log( rx.test("Вася-Пупкин’о") ); // => false
console.log( rx.test("Łukasz Ąłski") );  // => true
console.log( rx.test("Chloé Alméras") ); // => true

如果你想匹配任何字母 西里尔字母,你只需要像这样添加一个否定前瞻:

const rx = /^(?:(?!\p{sc=Cyrl})[\p{Alphabetic} '`’–-])+$/u;
console.log( rx.test("Вася-Пупкин’о") ); // => false
console.log( rx.test("עֲדִינָה") );         // => true
console.log( rx.test("Łukasz Ąłski") );  // => true
console.log( rx.test("Chloé Alméras") ); // => true

详细了解 value aliases and canonical values for the Unicode properties (Script and Script_Extensions) here