【问题标题】:Regex: Everything until last occurrence of pattern正则表达式:直到最后一次出现模式的所有内容
【发布时间】:2018-12-14 20:09:25
【问题描述】:

给定以下字符串:

'/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f/g'
'/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f/'
'/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f'
'/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f/g/xxx/xxx'

我正在寻找一个匹配的正则表达式

/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f

以上所有字符串

也就是说,匹配直到该模式最后一次出现的所有内容:

{正斜杠或字符串开头} 然后 {xxx} 然后 {正斜杠} 然后 {任何不等于 xxx 的字符组(正斜杠除外)} 然后 {正斜杠或结束字符串}

我不知道如何将上述模式翻译成正则表达式。

我尝试的.*\/ 模式并没有解决问题。

【问题讨论】:

  • @WiktorStribiżew 感谢您一直以来的优秀正则表达式。我认为这不是您链接的内容的重复,因为答案包括 /。
  • @WiktorStribiżew 没关系,OP 编辑​​了问题并完全改变了它。
  • @SproutCoder 哪些代码/模式不适合您?您当前的标题和匹配所有内容直到最后一次出现此模式要求符合this post。如果该解决方案不适合您,请更新问题。
  • @SproutCoder 我不明白你的编辑。为什么 /a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f 完全匹配而不是 /a/xxx/b/c/xxx/xxx/d/e/xxx/xxx 因为最后/不应该包括什么?最后一个所谓的好匹配的g在哪里?它不应该只是删除 /xxx.. 部分吗?实际上不应该只删除最后一个 /xxx 吗?
  • 那么,regex101.com/r/UYvZDh/6 按预期工作,对吧?

标签: javascript regex path


【解决方案1】:

你可以使用

/(?:.*\/)?xxx\/(?!xxx(?![^\/]))[^/]*(?=$|\/)/

请参阅regex demo

详情

  • (?:.*\/)? - 可选组匹配
    • .* - 除换行符以外的任何 0+ 个字符,尽可能多
    • \/ - 一个 / 字符
  • xxx\/ - xxx/ 子字符串
  • (?!xxx(?![^\/])) - 从字符串中下一个位置开始的文本不能等于字符串末尾的xxx/xxx
  • [^/]* - 除了/ 之外的任何 0+ 个字符,尽可能多 ([^/]*)
  • (?=$|\/) - 当前位置右侧必须有字符串结尾或/

JS 演示:

var strs = ['/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f/g','/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f/','/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f','/a/xxx/b/c/xxx/xxx/d/e/xxx/xxx/f/g/xxx/xxx','/xxx/f/g','xxx/f/g','a/xxx/f/g','/a/xxx/f/g','/a/xxx/b/c/xxx/xxx/d/e/xxx/gggxxxd/f/gxxxf/'];
var rx = /(?:.*\/)?xxx\/(?!xxx(?![^\/]))[^/]*(?=$|\/)/;
for (var s of strs) {
  console.log(s, "=>", s.match(rx)[0]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2018-10-17
    相关资源
    最近更新 更多