我知道有无数的正则表达式问题,但我无法找到一个适合我的情况。
假设我有以下pathname
:
/u/some_user/create/initial
我如何从这个字符串中提取'some_user'
?
我非常接近这个:
const pathname = '/u/some_user/create/initial';
const result = pathname.match(/(/u/)(.{1,}/)(.+)/);
console.log('result', result);
如果字符串是'/u/some_user/create'
,这个可以可能工作——它将返回some_user/
,我可以过滤掉末尾的斜杠。但是如果字符串有更多的斜杠,如上所述,那么这只返回'some_user/create/'
。
怎样才能只拔'some_user'
?
您可以使用一个捕获组和一个否定的字符类:
/u/([^/]+)
/u/
匹配/u/
(
捕获组1[^/]+
使用否定字符类匹配除/
以外的1+字符
)
关闭组1
查看regex101演示。
const regex = //u/([^/]+)/;
[
"/u/some_user/create/initial",
"/u/some_user/create",
"test/123/u/some_user/a/b/c"
].forEach(s => {
const m = s.match(regex);
if (m) {
console.log(m[1]);
}
});
如果你不想交叉换行,在some_user:
后面必须有一个/
/u/([^/s]+)/
查看另一个正则表达式101演示。
如果你不关心旧浏览器的支持,包括Safari和任何安装在Mac/iOS上的浏览器,那么这将工作:
/(?<=^/u/)[^/]+/
var regexp = /(?<=^/u/)[^/]+/;
console.log( `/u/some_user/create/initial`.match( regexp ) );
console.log( `/u/`.match( regexp ) );
console.log( `/wrong/format/url`.match( regexp ) );
console.log( `/u/another_user/create/initial`.match( regexp ) );
https://regex101.com/r/NmtKxD/1
尽管请求正则表达式,但使用两种常见字符串方法中的任何一种都可以轻松解决该特定问题。
string.split
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
返回一个由子字符串组成的数组,该数组根据作为参数提供的任何字符或多个字符进行分隔。通过在每个斜杠处分割字符串,所需的字符串是结果数组的元素[2](因为元素[0]将是空的-从第一个"/"之前的0个字符派生)。
即:
const url = "/u/some_user/create/initial";
requiredString = url.split("/")[2];
console.log(requiredString); // "some_user";
字符串片
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice
如果目标子字符串的位置是可用的,无论是数值上的还是参考已知的边界测试,string.slice
提供了一种简单的方法来提取所需的子字符串。
在本例中,边界文本部分用于提取所需字段:
const url = "/u/some_user/create/initial";
beforeText = "/u/";
afterText = "/create";
let requiredString = url.slice(url.indexOf(beforeText)+beforeText.length, url.indexOf(afterText));
console.log(requiredString); // "some-user"
这两个方法都是可靠的核心javascript,所有解释器都支持。