regex JavaScript正则表达式字符排除

lhcgjxsq  于 2023-05-23  发布在  Java
关注(0)|答案(5)|浏览(143)

我有一个这样的js正则表达式:

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

现在我想从a-zA-Z中排除像QVXqvx这样的字母。如何修改这个正则表达式的语法?
我试过了,但没有运气。请帮帮我
先谢谢你了

q1qsirdb

q1qsirdb1#

您仍然可以使用范围,但必须使用排除这些字母的范围,例如A-PR-UWYZ

svgewumm

svgewumm2#

最好的方法是简单地更新范围以排除不需要的字母。这将给你留下这个:

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

您可以使用负前瞻来实现字符类减法。但是,由于您对每个匹配的字符串重复负向前查找,因此效率会降低。无论如何,这看起来是这样的:

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

当你不像这样无限次重复一个角色类时,这是最好的。
包括Java和. NET在内的几种正则表达式风格使用特殊语法有效地支持字符类减法。
在Java中,与否定组相交:

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

一个鲜为人知的事实是,Opera Web浏览器实际上在其原生JavaScript正则表达式中支持上述Java语法。Opera可能会在未来删除此功能,因为它是非标准的(它基于废弃的ES4提案),但至少在当前版本(v11.64)中可以工作。
. NET、XPath和XML Schema支持以下更简单的字符类减法语法:

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

gdx19jrr3#

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

f87krz0w

f87krz0w4#

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

0md85ypi

0md85ypi5#

对于新推出的v flag,不需要更多的基于外观的变通方法(参见截至2023年5月16日TC39工艺Stage 4中的feature proposal)。
如果您的JavaScript环境支持v标志,则可以在字符类中使用--运算符来执行字符类减法。下面是一个匹配除Pi之外的所有希腊字母的例子:

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

在您的例子中,要将QVXqvxa-zA-Z范围中“排除”,可以使用 * 嵌套字符类 *:

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标志提供对这一新功能的实验性支持。

相关问题