正则表达式问题:如何保留指定匹配项并删除其余内容?
正则表达式问题分析与正确实现
你写的正则为什么不对
你之前的正则/[^(\bhttps:\/\/\b)]|[^(\b\.ingest.sentry.io\/\b)]/g存在几个核心错误:
- 字符集用法错误:
[^...]是「单个字符取反匹配」,只能针对单个字符,没法匹配https://这种多字符的完整片段。你试图用它保留整个子串,逻辑完全不成立。 - 单词边界
\b误用:\b是单词边界(匹配单词字符和非单词字符的分界),https://里的://都是非单词字符,\bhttps:\/\/\b的边界位置根本不符合你要匹配的子串位置,而且放在字符集里完全没有意义。 - 逻辑错误:两个取反字符集用
|连接,意味着匹配「不在第一个集合的字符」或者「不在第二个集合的字符」——几乎所有字符都会被匹配到,最终只会把所有内容删掉,完全达不到保留目标子串的效果。
正确实现方案
要保留https://和.ingest.sentry.io/,可以用两种思路:
思路1:捕获目标子串并替换
用正则捕获需要保留的两个部分,把整个字符串替换成这两个捕获组的拼接:
- 正则表达式:
^(https:\/\/).*?(\.ingest\.sentry\.io\/).*$ - 替换为:
$1$2
解释:
^匹配字符串开头,(https:\/\/)捕获第一个要保留的片段.*?非贪婪匹配中间所有内容(直到遇到后面的目标子串)(\.ingest\.sentry\.io\/)捕获第二个要保留的片段.*$匹配剩余所有内容- 替换时只保留两个捕获组的内容,就得到
https://.ingest.sentry.io/
思路2:删除不需要的部分
直接匹配并删除https://之后到.ingest.sentry.io/之前的内容,以及.ingest.sentry.io/之后的所有内容:
- 正则表达式:
/(?<=https:\/\/).*?(?=\.ingest\.sentry\.io\/)|(?<=\.ingest\.sentry\.io\/).*/g - 替换为空字符串即可
解释:
(?<=https:\/\/)是正向预查,确保前面是https://.*?(?=\.ingest\.sentry\.io\/)非贪婪匹配到.ingest.sentry.io/之前的内容,删除这部分(?<=\.ingest\.sentry\.io\/).*匹配.ingest.sentry.io/之后的所有内容,删除这部分
内容的提问来源于stack exchange,提问作者Micheal J. Roberts
相关产品推荐
相关产品推荐

