var rx = /^[[a-zA-Z]--[eE]]+$/v;
var strs = ['america','e', 'E', 'world','hello','welcome','board','know'];
for (var s of strs) {
console.log(s, "=>", rx.test(s));
}
因此,[[a-zA-Z]--[eE]]+匹配A-Z和a-z范围中出现的一个或多个字母,但e和E除外。 另请参阅有关 * 与&& * 和 Union 的交集的更多信息。
参见regex demo。 这种技术可以在所有支持lookaheads的正则表达式中使用。注意在Java和其他一些语言中,你可以使用character class subtraction,但是JS RegExp不支持它(Python re也不支持)。例如,在Java中,您可以使用s.matches("(?i)[a-z&&[^e]]+")。
图案详情:
^-字符串的开头
(?:(?!e)[a-z])+-a-z和A-Z范围内的1个或多个字符,但e和E
$-字符串锚的末端
i-大小写不敏感修饰符。
JS演示:
var rx = /^(?:(?!e)[a-z])+$/i;
var strs = ['america','e', 'E', 'world','hello','welcome','board','know'];
for (var s of strs) {
console.log(s, "=>", rx.test(s));
}
5条答案
按热度按时间slhcrj9b1#
现代解决方案
随着
v
flag的采用,JavaScript正则表达式模式现在支持character class union, intersection and subtraction.在这种情况下,字符类减法是必要的:因此,
[[a-zA-Z]--[eE]]+
匹配A-Z和a-z范围中出现的一个或多个字母,但e
和E
除外。另请参阅有关 * 与
&&
* 和 Union 的交集的更多信息。遗留解决方案
你可以使用
[a-z]
字符类,但是用negative lookahead(?!e)
限制它,用分组结构(?:...)
将这个模式分组,并在模式周围添加锚点:参见regex demo。
这种技术可以在所有支持lookaheads的正则表达式中使用。注意在Java和其他一些语言中,你可以使用character class subtraction,但是JS RegExp不支持它(Python
re
也不支持)。例如,在Java中,您可以使用s.matches("(?i)[a-z&&[^e]]+")
。图案详情:
^
-字符串的开头(?:(?!e)[a-z])+
-a-z
和A-Z
范围内的1个或多个字符,但e
和E
$
-字符串锚的末端i
-大小写不敏感修饰符。JS演示:
raogr8fs2#
需要锚点
^
(字符串的开头)和$
(字符串的结尾);否则你的模式可以部分匹配任何字符串,只要它包含的字母表不是 e:ltqd579y3#
您也可以在reg中添加大写字母:
请参考许多在线网站来学习正则表达式的创建步骤https://regex101.com
kh212irz4#
以下是几个可供选择的答案:
1.使用前瞻:
首先检查下一个字符是否是字母,然后 * 检查它是否不是
e
(或E
)。这是JavaScript中有效的正则表达式语法,但性能不如公认的答案。
1.使用集合交集:
这是匹配“
a-z
“和“note
“的 *set交集 * 中的字符。这是JavaScript中无效的语法。但是,它与公认的答案具有相同的性能。它只在其他各种regex“风格”中有效,如Java,Perl,PHP,Python和Ruby。
1.使用集减法:
这是匹配“
a-z
”和e
的 * 集合减法 * 中的字符。这是JavaScript中无效的语法。但是,它与公认的答案具有相同的性能。它只在其他各种regex“风格”(如Python和. Net)中有效。(语法也略有不同,例如。
-
与--
。)r7s23pms5#
为什么不一步一步地遍历单词中的每个字符呢?