正则表达式需求:删除非指定匹配文本,保留目标内容
问题描述
- 原始字符串:
"This is some text.|Some more text.|Some other text.|Some different text."
- 需求:删除所有不符合以下条件的文本:
- 保留行首的前n个字符;
- 保留每个
|后的前n个字符。
- 当n=10时:
- 需要删除的文本:
"me text.|text.| text.|rent text."- 最终期望结果:
"This is so, Some more , Some other, Some diffe" - 当前问题:尝试正则
^(.{20})|(\|)(.{20})仅能选中部分目标文本,无法实现删除非目标内容的需求。
解决方案
核心思路
放弃直接选中需保留内容的思路,转而匹配所有需要删除的冗余内容并替换为空,最后调整分隔符即可得到目标结果。
具体操作(以n=10为例)
1. 删除冗余内容
使用以下正则进行全局替换:
- 查找:
(?:^.{10}|\|.{10})\K.*?(?=\||$) - 替换值:空字符串
正则解释:
(?:^.{10}|\|.{10}):匹配行首前10个字符,或|后的前10个字符(非捕获组,不参与替换)\K:重置匹配起点,此前的内容不会被替换.*?(?=\||$):匹配到下一个|或字符串结尾的所有冗余内容(这部分就是要删除的)
替换后字符串变为:
"This is so|Some more |Some other |Some diffe"
2. 替换分隔符
将剩余的|全局替换为, ,得到最终结果:
"This is so, Some more , Some other, Some diffe"
通用化适配
若需适配任意n值,只需将正则中的10替换为目标数字即可:
(?:^.{n}|\|.{n})\K.*?(?=\||$)
兼容处理
如果使用的工具/语言不支持\K断言,可改用捕获组方式:
- 查找:
(^.{10}|\|.{10})(.*?)(?=\||$) - 替换为:
$1
内容的提问来源于stack exchange,提问作者VBADirk
相关产品推荐
相关产品推荐

