【问题标题】:Regex - starts with a particular string but does not end with another substring正则表达式 - 以特定字符串开头但不以另一个子字符串结尾
【发布时间】:2019-08-26 22:10:22
【问题描述】:

给定两个字符串s1s2,我正在尝试编写一个正则表达式来匹配以s1 开头但不以s2 结尾的字符串

示例(s1=TEST,s2=BAD)

  • TEST-101 匹配
  • TEST-SOME-DESC 匹配
  • TEST-101-BAD 不应匹配
  • TEST-SOME-DESC-BAD 不应匹配

这是我为这个示例尝试过的,但它不起作用:/^TEST-.*((?!BAD))$/

【问题讨论】:

  • @CarySwoveland 感谢您的建议,我根据您的建议改进了问题
  • 好多了。 "TEST-101-SINBAD" 呢? (Sinbad 在航海界享有盛誉。)
  • 我知道“TEST-101-SINBAD”接受的解决方案将失败(因为我希望它不匹配)。但我知道如何编写我的实际正则表达式。
  • 如果您将正则表达式更改为/^(?!.+\bBAD$)TEST-.*/\b 是一个分词,"TEST-101-SINBAD" 将被接受。

标签: javascript regex ruby


【解决方案1】:

试试这个:

/^(?!.+BAD$)TEST-.*/

这匹配开始,继续并拒绝任何以错误字符串结尾的内容,然后匹配所需的模式。

这是一个demo,它通过了所有四项测试(点击底部的“运行测试”进行验证)。

【讨论】:

  • 感谢您的快速回复。我不明白为什么负面展望出现在模式的开头。
  • 把它放在最后的问题基本上是没有什么可以匹配的。假设您的字符串是TEST-101-BAD。在您尝试的正则表达式中,^TEST-.* 可以匹配整个字符串,包括BAD。因为这是真的,没有更多的字符可以匹配,所以(?!BAD) 签出。然后是字符串的结尾($),所以字符串通过了。您真正想要并且非常适合这种情况的是“否定后向断言”(请参阅​​here),但 JavaScript 的正则表达式风格不支持它。
【解决方案2】:

您可以使用startsWithendsWith

let arr = [`TEST-101`, `TEST-SOME-DESC`,`TEST-101-BAD`,`TEST-SOME-DESC-BAD`]

arr.forEach(e=>{
  console.log(e, e.startsWith('TEST') && !e.endsWith('BAD'))
})

【讨论】:

  • 我正在寻找一个纯正则表达式解决方案
【解决方案3】:

JavaScript 中使用:

/^TEST-(?!.*BAD$).*/

Ruby 中:

/\ATEST-(?!.*BAD\z).*/

regex proof

解释

--------------------------------------------------------------------------------
  ^ / \A                   the beginning of the string
--------------------------------------------------------------------------------
  TEST-                    'TEST-'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    BAD                      'BAD'
--------------------------------------------------------------------------------
    $ / \z                   the end of the string
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  .*                       any character except \n (0 or more times
                           (matching the most amount possible))

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 2013-10-27
    • 2013-08-04
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    相关资源
    最近更新 更多