如果存在,则在第三次出现角色后替换所有内容

时间:2013-07-23 17:12:26

标签: javascript regex string

以下是我要做的事情:

给定一个字符串,如果字符串以“/ 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

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

3 个答案:

答案 0 :(得分:3)

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

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

这样做:

  1. 捕获:
    • 在字符串
    • 开头匹配/plan
    • ...后跟/
    • ...后跟一个或多个非/
  2. 匹配以下/后跟任何内容以结束字符串
  3. 将完整匹配替换为第一个捕获组
  4. (如果没有匹配,则无法替换。)

    测试:Live Copy | Source

    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);
      }
    }
    

    结果:

    OK: =>
    OK: /foo => /foo
    OK: /plan/123 => /plan/123
    OK: /plan/123/4567 => /plan/123
    OK: /plan/123/4567/89010 => /plan/123

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

答案 2 :(得分:0)

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

var str = "/plan/123/4567/89010";
str.replace(/(^\/plan\/[^\/]*).*$/, '$1');