我找到了一个返回字符串第二部分的案例的答案,例如:
"qwe_fs_xczv_xcv_xcv_x".replace(/([^\_]*\_){**nth**}/, '');
- 其中n是要删除的事件数量。
如果 nth = 3,以上将返回“xcv_xcv_x”
此StackOverflow帖子中的详细信息:Cutting a string at nth occurrence of a character
如何更改上面的正则表达式以返回第一部分(即“qwe_fs_xczv”)?
答案 0 :(得分:1)
您需要使用end anchor($
)来断言结束位置。
"qwe_fs_xczv_xcv_xcv_x".replace(/(_[^_]*){nth}$/, '');
// --------------------^-----------^--- here
console.log(
"qwe_fs_xczv_xcv_xcv_x".replace(/(_[^_]*){3}$/, '')
)

更新:要获得前n个细分,您需要使用String#match
方法,且正则表达式略有不同。
"qwe_fs_xczv_xcv_xcv_x".match(/(?:(?:^|_)[^_]*){3}/)[0]
console.log(
"qwe_fs_xczv_xcv_xcv_x".match(/(?:(?:^|_)[^_]*){3}/)[0]
)

(?:^|_)
有助于断言起始位置或匹配前导_
。
Regex explanation here。
正则表达式的另一个替代方案是/^[^_]*(?:_[^_]*){n-1}/
。最终的正则表达式将是:
/^[^_]*(?:_[^_]*){2}/
console.log(
"qwe_fs_xczv_xcv_xcv_x".match(/^[^_]*(?:_[^_]*){2}/)[0]
)

答案 1 :(得分:1)
如果您想使用replace
,请在第三个_
之前捕获并替换为该组:
const re = /^(([^_]*_){2}[^_]*(?=_)).*$/;
console.log("qwe_fs_xczv_xcv_xcv_x".replace(re, '$1'));
console.log("qwe_fs_xczv_xcv_xcv_x_x_x".replace(re, '$1'));

但是使用match
直接匹配所需的子字符串会更好:
const re = /^([^_]*_){2}[^_]*(?=_)/;
console.log("qwe_fs_xczv_xcv_xcv_x".match(re)[0])
console.log("qwe_fs_xczv_xcv_xcv_x_x_x".match(re)[0])

答案 2 :(得分:1)
使用String.match()
从字符串的开头(^
)查看没有下划线的三个字符序列,可能以下划线(regex101)开头:
const result = "qwe_fs_xczv_xcv_xcv_x".match(/^(?:_?[^_]+){3}/);
console.log(result);