Javascript正则表达式来匹配以某些字符结尾但不以这些字符的特定组合结尾的字符串

Javascript正则表达式来匹配以某些字符结尾但不以这些字符的特定组合结尾的字符串,javascript,regex,Javascript,Regex,假设使用Javascript,我想匹配以[abcde]*结尾的字符串,但不以abc结尾 因此正则表达式应该匹配xxxa,xxxbc,xxxabd,而不是xxxabc 我完全糊涂了 编辑:出于某种原因,我不得不使用正则表达式,如果(str.endsWith(“abc”))嗯 var regex = /(ab[abde]|[abcde])$/; // wrong 也许吧?等等,不;等一下: var regex = /(ab[abde]|([^a].|.[^b])[abcde]|\b.?[abcde

假设使用Javascript,我想匹配以
[abcde]*
结尾的字符串,但不以
abc
结尾

因此正则表达式应该匹配
xxxa
xxxbc
xxxabd
,而不是
xxxabc

我完全糊涂了

编辑:出于某种原因,我不得不使用正则表达式,如果(str.endsWith(“abc”))嗯

var regex = /(ab[abde]|[abcde])$/; // wrong
也许吧?等等,不;等一下:

var regex = /(ab[abde]|([^a].|.[^b])[abcde]|\b.?[abcde])$/;
这就是“ab”,后面跟着“a”、“b”、“d”或“e”;或第一个字符不是“a”或第二个字符不是“b”的任何两个字符序列,后跟“a”到“e”;或者任何单词边界后跟任何字符(可能)后跟“a”到“e”。最后一条是处理短字符串;这是一种欺骗,但在本例中它是有效的。

首先,请注意每个字符串都以
[abcde]*
结尾,因为这允许零宽度。因此,我们实际上只是在寻找一个正则表达式,它匹配的字符串不以abc结尾。简单

([^c]|[^b]c|[^a]bc)$

这是不是
c
,不是
b
然后是
c
,或者不是
a
然后是
bc
,无论哪个选项,然后是字符串的结尾。

解决方案很简单:使用负前瞻:

(?!.*abc$)
这声明字符串不以
abc
结尾

您提到您还需要字符串以
[abcde]*
结尾,但是
*
表示它是可选的,因此
xxx
匹配。我假设您真的想要
[abcde]+
,这也意味着它需要以
[abcde]
结束。在这种情况下,断言是:

(?=.*[abcde]$)(?!.*abc$)
有关正面和负面环视的教程,请参见


我不愿意给出实际的Javascript正则表达式,因为我对该语言不熟悉(尽管我相信断言如果得到支持,会起作用——据我所知,Javascript支持正向和反向前瞻)。感谢Pointy和Alan Moore的评论,我认为合适的Javascript正则表达式如下:

var regex = /^(?!.*abc$).*[abcde]$/;

请注意,这个版本(归功于Alan Moore)不再需要积极的前瞻。它只是简单地匹配
*[abcde]$
,但首先断言
^(?。*abc$)

问题没有正确定义,或者每个人都忽略了一个简单的答案

var re = /abc$/;

!re.test("xxxa");    // pass
!re.test("xxxbc");   // pass
!re.test("xxxabd");  // pass
!re.test("xxxabc");  // fail

所有这些都以
/[abcde]*
/

结尾,我只想对@maček说,你的答案用
简单明了在开头
但是我真的希望not操作符在regexp中,这样我就可以将它用于例如:
Array::some
Array::filter
Array::find
Array::findIndex
,而不必创建函数或wile循环

以下是一个例子:

var项目=[“ja”、“ka”、“mf”、“bg”、“vb”、“b”]
var regex=/^((?!a$| b$)*$/;//匹配不以a或b结尾的字符串
var matched=items.filter(RegExp.prototype.test,regex);

警报(匹配);//结果:[“mf”,“bg”]
应该
[abcde]*
真的是
[abcde]+
?否则,
xxx
匹配很好。这不起作用。在Javascript中尝试-第二个正则表达式匹配“xxabc”。@Pointy:
“xxabc”。匹配((?=.*[abcde]$)(?!.*abc$).*)
在Java中是
false
;我承认我不熟悉任何特定的Javascript风格,但如果它支持正向和负向前瞻,那么正则表达式应该可以工作。@Pointy:
“xxabc.match(/^(?=..[abcde]$)(?!.*abc$).$/)
在Javascript中是
null
(尽管我不确定这是否是在这种语言中使用正则表达式的正确方法)。尝试regex.test(“xxabc”)-returns boolean我认为没有必要进行积极的前瞻:
^(?。*abc$).[abcde]$
简单、聪明。只需对最后一个字符和“and”布尔结果进行测试。同意,非常简单,但对我来说,
无法使用它在开头