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

时间:2010-04-08 15:16:38

标签: javascript regex

假设使用Javascript,我希望匹配以[abcde]*结尾但不包含abc的字符串。

因此正则表达式应匹配xxxaxxxbcxxxabd,但不匹配xxxabc

我完全糊涂了。

修改:出于某种原因,我必须使用正则表达式,我无法做某事if (str.endsWith("abc"))

5 个答案:

答案 0 :(得分:27)

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

(?!.*abc$)

这断言字符串不以abc结尾。

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

(?=.*[abcde]$)(?!.*abc$)

有关正面和负面外观的教程,请参阅regular-expressions.info


我不愿意提供实际的Javascript正则表达式,因为我不熟悉该语言(尽管我确信断言,如果支持,会起作用 - 根据regular-expressions.info,Javascript支持正面和负面展望)。感谢Pointy和Alan Moore的评论,我认为正确的Javascript正则表达式是这样的:

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

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

答案 1 :(得分:16)

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

var re = /abc$/;

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

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

结尾

答案 2 :(得分:2)

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

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

这不是c,不是b后跟c的东西,或者不是a后跟bc的东西,以及任何选项那些,然后是字符串的结尾。

答案 3 :(得分:1)

只想对@maček说,你回答的问题很简单,一开始只有! 但我真的希望not运算符在regexp中,所以我可以使用它,例如:Array::someArray::filterArray::findArray::findIndex而无需创建函数或者是一个诡计循环

以下是一个例子:

var items = ["ja", "ka", "mf", "bg", "vb", "b"]
var regex = /^((?!a$|b$).)*$/; // match a string that doesn't end with a or b

var matched = items.filter(RegExp.prototype.test, regex);

alert(matched); // result: ["mf", "bg"]

答案 4 :(得分:0)

嗯...

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”。最后一个条款是处理短字符串;这是一种欺骗,但在这种情况下,它有效。