我有一个这样的js正则表达式:
/^[a-zA-ZęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/
现在我想从a-zA-Z中排除像QVXqvx这样的字母。如何修改这个正则表达式的语法?我试过了,但没有运气。请帮帮我先谢谢你了
q1qsirdb1#
您仍然可以使用范围,但必须使用排除这些字母的范围,例如A-PR-UWYZ
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]]+$/
gdx19jrr3#
不能。在这种情况下,您需要 * 手动 * 枚举除排除的QVXqvx之外的所有字母
QVXqvx
f87krz0w4#
/^[a-pA-PR-Ur-uWwYyZzęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/
0md85ypi5#
对于新推出的v flag,不需要更多的基于外观的变通方法(参见截至2023年5月16日TC39工艺Stage 4中的feature proposal)。如果您的JavaScript环境支持v标志,则可以在字符类中使用--运算符来执行字符类减法。下面是一个匹配除Pi之外的所有希腊字母的例子:
v
--
console.log(/[\p{Script_Extensions=Greek}--π]/v.test('π')) // => false console.log(/[\p{Script_Extensions=Greek}]/v.test('π')) // => true
在您的例子中,要将Q、V、X、q、v和x从a-zA-Z范围中“排除”,可以使用 * 嵌套字符类 *:
Q
V
X
q
x
a-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标志提供对这一新功能的实验性支持。
--harmony-regexp-unicode-sets
5条答案
按热度按时间q1qsirdb1#
您仍然可以使用范围,但必须使用排除这些字母的范围,例如A-PR-UWYZ
svgewumm2#
最好的方法是简单地更新范围以排除不需要的字母。这将给你留下这个:
您可以使用负前瞻来实现字符类减法。但是,由于您对每个匹配的字符串重复负向前查找,因此效率会降低。无论如何,这看起来是这样的:
当你不像这样无限次重复一个角色类时,这是最好的。
包括Java和. NET在内的几种正则表达式风格使用特殊语法有效地支持字符类减法。
在Java中,与否定组相交:
一个鲜为人知的事实是,Opera Web浏览器实际上在其原生JavaScript正则表达式中支持上述Java语法。Opera可能会在未来删除此功能,因为它是非标准的(它基于废弃的ES4提案),但至少在当前版本(v11.64)中可以工作。
. NET、XPath和XML Schema支持以下更简单的字符类减法语法:
gdx19jrr3#
不能。在这种情况下,您需要 * 手动 * 枚举除排除的
QVXqvx
之外的所有字母f87krz0w4#
/^[a-pA-PR-Ur-uWwYyZzęóąśłżźćńĘÓĄŚŁŻŹĆŃ]+$/
0md85ypi5#
对于新推出的
v
flag,不需要更多的基于外观的变通方法(参见截至2023年5月16日TC39工艺Stage 4中的feature proposal)。如果您的JavaScript环境支持
v
标志,则可以在字符类中使用--
运算符来执行字符类减法。下面是一个匹配除Pi之外的所有希腊字母的例子:在您的例子中,要将
Q
、V
、X
、q
、v
和x
从a-zA-Z
范围中“排除”,可以使用 * 嵌套字符类 *:从2023年5月19日起,V8 v11.0(Chrome 110)通过
--harmony-regexp-unicode-sets
标志提供对这一新功能的实验性支持。