以下是我要做的事情:
给定一个字符串,如果字符串以“/ 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
理想情况下,我希望通过正则表达式完全实现这一点,但考虑到一些要求,我意识到它可能不容易实现。
答案 0 :(得分:3)
这是一种使用正则表达式和replace
的方法:
var str = /* ... */;
str = str.replace(/^(\/plan\/[^\/]+)\/.*$/, '$1');
这样做:
/plan
/
/
/
后跟任何内容以结束字符串(如果没有匹配,则无法替换。)
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');