我想为除“e”之外的任何字母表制作正则表达式 这就是我提出的 -
/([a-d]|[f-z])+?/i
我做错了什么?
答案 0 :(得分:5)
您需要锚点^
(字符串的开头)和$
(字符串的结尾);否则你的模式可以部分匹配任何字符串,只要它包含 e 以外的字母:
/^[a-df-z]+$/i.test("america")
// false
/^[a-df-z]+$/i.test("amrica")
// true
/^[a-df-z]+$/i.test("e")
// false
答案 1 :(得分:3)
您可以使用[a-z]
字符类,但使用negative lookahead (?!e)
限制,将此模式与分组构造(?:...)
分组,在模式周围添加锚点:
/^(?:(?!e)[a-z])+$/i
请参阅regex demo。
此技术适用于支持前瞻的所有正则表达式。请注意,在Java和其他一些语言中,您可以使用character class subtraction,但JS RegExp(也不是Python re
)不支持它。例如,在Java中,您可以使用s.matches("(?i)[a-z&&[^e]]+")
。
模式详情:
^
- 字符串开头(?:(?!e)[a-z])+
- a-z
和A-Z
范围内的一个或多个字符,但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));
}

答案 2 :(得分:1)
您还可以在reg中使用此项添加资本:
^[a-df-zA-DF-Z]+$
i.test("America")
// false
i.test("Amrica")
// true
i.test("e") or i.test("E")
// false
请参考许多在线网站,逐步学习正则表达式创建 https://regex101.com
答案 3 :(得分:0)
另外几个答案是:
使用前瞻:
/^((?=[a-z])[^e])+$/i
首先检查下一个字符是否为字母,然后检查它不是e
(或E
)。
这是JavaScript中的有效正则表达式语法,但其性能低于接受的答案。
使用set intersection:
/^[[a-z]&&[^e]]+$/i
这是“a-z
”和“不e
”的集合交集中匹配的字符。
这是 JavaScript中无效的语法。但是,它与公认的答案同样具有高效性。它只是Java,Perl,PHP,Python和Ruby等各种其他正则表达式“有形”的有效语法。
使用set subtraction:
/^[[a-z]--[e]]+$/i
这是“a-z
”和e
的集合减法中匹配的字符。
这是 JavaScript中无效的语法。但是,它与公认的答案同样具有高效性。它只是Python和.Net等各种其他正则表达“风格”中的有效语法。 (语法也略有不同,例如-
与--
。)