【问题标题】:Javascript regex to match a string that ends with some characters but not with a particular combination of thoseJavascript 正则表达式以匹配以某些字符结尾但不以这些字符的特定组合结尾的字符串
【发布时间】:2010-04-08 15:16:37
【问题描述】:

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

所以正则表达式应该匹配xxxaxxxbcxxxabd,而不是xxxabc

我完全糊涂了。

编辑:出于某种原因我必须使用正则表达式,我不能做某事if (str.endsWith("abc"))

【问题讨论】:

  • [abcde]* 真的应该是[abcde]+ 吗?否则 xxx 匹配就好了。

标签: javascript regex


【解决方案1】:

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

(?!.*abc$)

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

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

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

请参阅regular-expressions.info 获取有关正面和负面环视的教程。


我不愿意给出实际的 Javascript 正则表达式,因为我不熟悉该语言(尽管我确信断言,如果支持的话,会起作用 -- 根据regular-expressions.info,Javascript 支持正向和负向预测) .感谢 Pointy 和 Alan Moore 的 cmets,我认为正确的 Javascript 正则表达式是这样的:

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

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

【讨论】:

  • 那行不通。用 Javascript 试试——第二个正则表达式匹配“xxabc”。
  • @Pointy: "xxabc".matches("(?=.*[abcde]$)(?!.*abc$).*") 在 Java 中是 false;我承认我不熟悉任何特定的 Javascript 风格,但如果它支持正负前瞻,那么正则表达式应该可以工作。
  • @Pointy: "xxabc".match(/^(?=.*[abcde]$)(?!.*abc$).*$/) 在 Javascript 中是 null(尽管我不确定这是否是这种语言中正则表达式的正确方法)。
  • 尝试 regex.test("xxabc") - 返回布尔值
  • 我不认为 positive 前瞻是必要的:^(?!.*abc$).*[abcde]$
【解决方案2】:

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

var re = /abc$/;

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

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

【讨论】:

  • 简单,聪明。只需测试最后一个字符和“和”布尔结果。
  • 同意,很简单,但对于我的use case 来说,一开始就无法使用!
【解决方案3】:

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

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

这不是c,不是b,后跟c,或者不是a,后跟bc,以及其中任何一个选项,然后是字符串的结尾.

【讨论】:

    【解决方案4】:

    只想对@maček 说,你的回答简单明了,开头是! 但我真的希望 not 运算符位于正则表达式中,因此我可以将其与例如: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"]

    【讨论】:

      【解决方案5】:

      嗯……

      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”。最后一个子句是处理短字符串;这有点作弊,但在这种情况下它有效。

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        • 2023-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多