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。
我必须写一些正则表达式。我知道哪里有很多变体。但是发现有不懂的地方,所以想请教一下。
我有这个正则表达式:
/^[\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。