如何修改正则表达式以截取字符串第n次字符出现的前半部分
嘿,这个调整其实超简单,换个思路就行!
原正则是通过移除前nth个[^_]*_块来拿到后半部分,现在要获取前半部分,咱们只需要捕获前nth个由下划线分隔的片段,然后把后面的内容全删掉就搞定了。
修改后的正则方案如下:
"qwe_fs_xczv_xcv_xcv_x".replace(/^((?:[^\_]*\_){2}[^\_]*)(?:_.*)?$/, '$1');
当nth=3时,这里的{2}是nth-1的结果,运行后就能得到你想要的"qwe_fs_xczv"。
原理拆解:
^((?:[^_]*_){2}[^_]*):这是核心捕获组,专门匹配前nth个片段:(?:[^_]*_){2}:非捕获组,重复2次「任意非下划线字符+下划线」,对应前两个片段加下划线(qwe_、fs_);[^_]*:匹配第三个片段(xczv),不加下划线,避免结果末尾多出来个多余的下划线;
(?:_.*)?:匹配从第三个下划线开始到字符串结尾的所有内容,?是为了保证如果nth等于总片段数时,不会出现匹配失败的情况;- 最后把整个字符串替换为捕获组
$1,就只保留了咱们需要的前半部分。
如果要动态控制nth,用模板字符串生成正则就行:
const nth = 3; const str = "qwe_fs_xczv_xcv_xcv_x"; const result = str.replace(new RegExp(`^((?:[^_]*_){${nth-1}}[^_]*)(?:_.*)?$`), '$1');
内容的提问来源于stack exchange,提问作者edaus
相关产品推荐
相关产品推荐

