JavaScript正则表达式字符排除

6
我有这个JavaScript正则表达式:
/^[a-zA-ZęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/

但是我想要排除一些字母,即 a-zA-Z 中的 qvxQVX。我该如何修改正则表达式来实现这个目标?

我正在使用这个正则表达式来验证一个字符串。 - Mariusz Grodek
5个回答

9

您仍然可以使用范围,但是您需要排除那些字母,例如A-PR-UWYZ。


谢谢您提供如此简单的解决方案。我没想到它可以这么简单 :) - Mariusz Grodek

8

最好的方法是更新范围,以排除您不想要的字母。这样就会得到以下内容:

/^[a-pr-uwyzA-PR-UWYZęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/

您可以使用负向预查来实现一种字符类减法。但是,由于您需要为每个匹配的字符串重复执行负向预查,因此效率会降低。无论如何,以下是所需的格式:
/^(?:(?![qvxQVX])[a-zA-ZęóąśłżźćńĘÓĄŚŁŻŹĆŃ])+$/

当您不像这样无限次重复字符类时,此方法效果最佳。

包括Java和.NET在内的多种正则表达式语法支持使用特殊语法进行字符类减法。

在Java中,可以与否定组相交:

/^[a-zA-ZęóąśłżźćńĘÓĄŚŁŻŹĆŃ&&[^qvxQVX]]+$/

一个鲜为人知的事实是,Opera浏览器实际上支持其本地JavaScript正则表达式中的上述Java语法。由于它是非标准的(基于已弃用的ES4提案),因此Opera可能会在未来删除此功能,但至少在当前版本(v11.64)中可以使用。
.NET、XPath和XML Schema支持以下更简单的语法来进行字符类减法:
/^[a-zA-ZęóąśłżźćńĘÓĄŚŁŻŹĆŃ-[qvxQVX]]+$/

1

不行。在这种情况下,您需要手动枚举除了排除的 QVXqvx 以外的所有字母。


1

随着新引入的v标志(请参见功能提案,截至2023年5月16日已进入TC39流程的第4阶段),不再需要基于lookaround的解决方法。

如果您的JavaScript环境支持v标志,则可以在字符类中使用--运算符执行字符类减法。以下是一个示例,匹配所有希腊字母但不包括派:

console.log(/[\p{Script_Extensions=Greek}--π]/v.test('π')) // => false
console.log(/[\p{Script_Extensions=Greek}]/v.test('π'))    // => true

在您的情况下,要从 a-zA-Z 范围中“排除” QVXqvx,您可以使用 嵌套字符类

console.log(Array.from(
     'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.matchAll(
               /[[A-Za-z]--[QVXqvx]]/vg)).flat().join(""))
// => ABCDEFGHIJKLMNOPRSTUWYZabcdefghijklmnoprstuwyz

截至2023年5月19日,V8 v11.0(Chrome 110)通过--harmony-regexp-unicode-sets标志提供了对这种新功能的实验性支持。

从 Chrome 112 和 Node 20 开始,启用了不带标志的 v 标志。 - Boris Verkhovskiy
从 Chrome 112 和 Node 20 开始,启用了不带标志的 v 标志。 - user3064538

0

/^[a-pA-PR-Ur-uWwYyZzęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接