【问题标题】:RegExp in JavaScript: include one Unicode group and exclude another oneJavaScript 中的正则表达式:包括一个 Unicode 组并排除另一个
【发布时间】:2022-01-27 07:52:10
【问题描述】:

我必须写一些正则表达式。而且我知道很多变种在哪里。但是我发现了我不明白的东西,所以我想问一下。

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

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

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

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

谢谢)

【问题讨论】:

  • 我不确定,但我认为你不能一次性完成(“匹配所有字母西里尔字母”);您是否可以将支票分成两个单独的步骤(首先匹配所有字母,然后从结果匹配中排除西里尔字母)?
  • @secan 是的,我可以。但也许这里有这种可能性)谁知道
  • Character Class Subtraction 不是正则表达式的通用特性。
  • @ceving [\p{IsThai}-[^\p{Nd}]] 我在 ']]' 中有错误 'Dangling metacharacter' 你知道吗?
  • @illia_6655321 你读过链接的文字吗?不要这么认为:XML Schema、XPath、.NET(2.0 版及更高版本)和 JGsoft 正则表达式支持字符类减法。这是否意味着 JavaScript 支持它?

标签: javascript regex web unicode


【解决方案1】:

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

由于您只想匹配拉丁字母,您应该将\p{Letter} 替换为\p{sc=Latin}\p{sc=Latn}(注意连字符应该只在字符类的末尾使用,这是在这里使用它的最简洁的方式)。

请注意,sc=Script=(这是用于脚本名称,scx=Script_Extensions= 可用于脚本扩展)前缀需要在 Unicode 类别类中使用这些脚本名称(请参阅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的信息。

【讨论】:

  • 谢谢!你帮了我很多。惊人而清晰的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多