正则表达式在第n次出现字符时剪切字符串并返回字符串的第一部分

时间:2018-05-06 06:57:43

标签: javascript regex

我找到了一个返回字符串第二部分的案例的答案,例如:

"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”)?

3 个答案:

答案 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);