给出以下字符串:
'/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的任何一组字符(正斜杠除外)},然后为{正斜杠或结尾字符串}
我不知道如何将上述模式转换为正则表达式。
我尝试过的.*\/
模式不能解决问题。
答案 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]);
}