正则表达式:直到最后一次出现图案为止的所有内容

时间:2018-07-06 08:58:37

标签: javascript regex path

给出以下字符串:

'/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的任何一组字符(正斜杠除外)},然后为{正斜杠或结尾字符串}

我不知道如何将上述模式转换为正则表达式。

我尝试过的.*\/模式不能解决问题。

1 个答案:

答案 0 :(得分: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]);
}