1

这是我正在尝试做的事情:

给定一个字符串,如果字符串以“/plan”开头,我想删除第三次出现“/”字符后的所有内容——假设有第三次出现,但可能没有。如果它以 "/plan" 开头,但少于 3 个 '/' 字符,则正则表达式应按原样返回字符串。

此外,如果字符串不以“/plan”开头,则可以按原样返回字符串。以下是一些示例输入和输出:

"" returns ""
"/foo" return "/foo"
"/plan/123" returns "/plan/123"
"/plan/123/4567" returns "/plan/123"
"/plan/123/4567/89010" returns "/plan/123

理想情况下,我想完全通过正则表达式来做到这一点,但考虑到一些要求,我意识到这可能不容易完成。

4

3 回答 3

4

这是一种使用正则表达式和的方法replace

var str = /* ... */;
str = str.replace(/^(\/plan\/[^\/]+)\/.*$/, '$1');

这样做:

  1. 捕获:
    • /plan在字符串开头匹配
    • ...其次是/
    • ...后跟一个或多个非/
  2. 将以下内容匹配/到字符串结尾的任何内容
  3. 将完全匹配替换为第一个捕获组

(如果没有匹配,就没有替代品。)

测试:Live Copy | 资源

var tests = [
    {test: "", expect: ""},
    {test: "/foo", expect: "/foo"},
    {test: "/plan/123", expect: "/plan/123"},
    {test: "/plan/123/4567", expect: "/plan/123"},
    {test: "/plan/123/4567/89010", expect: "/plan/123"}
  ];

var index, test, result;
for (index = 0; index < tests.length; ++index) {
  test = tests[index];
  result = test.test.replace(/^(\/plan\/[^\/]+)\/.*$/, '$1');
  if (result === test.expect) {
    display("OK: " + test.test + " => " + result);
  }
  else {
    display("FAIL: " + test.test + " => " + result);
  }
}

结果:

好的:=>
好的:/foo => /foo
好的:/plan/123 => /plan/123
好的:/plan/123/4567 => /plan/123
好的:/plan/123/4567/89010 => /plan/123
于 2013-07-23T17:18:11.747 回答
2

如果没有正则表达式,您可以使用简单的字符串拆分来做到这一点:

function planReplace(str) {
    var split = str.split('/');
    if (split.length < 2) return str;
    if (split[1] === 'plan') return "/" + split[1] + "/" + split[2];
    //this line can even be shorter, but it would use a bit more memory:
    //if (split[1] === 'plan') return split.splice(0, 3).join('/');
    return str;
}
于 2013-07-23T17:17:25.783 回答
0

您可以(^/plan/[^/]*).*$像这样使用正则表达式:

var str = "/plan/123/4567/89010";
str.replace(/(^\/plan\/[^\/]*).*$/, '$1');
于 2013-07-23T17:18:46.467 回答