如何编写匹配除双位数外所有内容的正则表达式?
解决方案:匹配除连续两位数字外的所有内容
别担心,正则入门阶段遇到这类问题太正常了~针对你的需求,我整理了两种实用的方法,结合你的示例来讲解:
方法1:替换法(最实用,推荐)
既然你已经知道用\d{2}匹配连续两位数字,那最简单的方式就是把所有匹配到的双位数替换为空字符串,剩下的就是你要的内容。这种方法在大多数编程语言/工具里都能直接用,操作起来最直观。
示例演示
拿你的第一个例子:<strong>TEST</strong>22<strong>KLO4567</strong>
- 用
\d{2}全局匹配所有双位数(22、45、67),替换为空后,结果是:<strong>TEST</strong><strong>KLO</strong>
第二个例子:<strong>QE</strong>45<strong>C2C</strong>
- 匹配并替换45后,结果是:
<strong>QE</strong><strong>C2C</strong>(这里的单个数字2不属于双位数,会被保留)
第三个例子:<strong>LOP</strong>10<strong>G7G400</strong>
- 匹配并替换10、40后,结果是:
<strong>LOP</strong><strong>G7G0</strong>(单个数字7和0被保留)
不同语言的代码示例
Python:
import re text = "<strong>TEST</strong>22<strong>KLO4567</strong>" result = re.sub(r'\d{2}', '', text) # 处理重叠双位数(比如4567要替换45和67),循环替换直到无匹配 while re.search(r'\d{2}', result): result = re.sub(r'\d{2}', '', result) print(result) # 输出: <strong>TEST</strong><strong>KLO</strong>JavaScript:
let text = "<strong>TEST</strong>22<strong>KLO4567</strong>"; let result = text.replace(/\d{2}/g, ''); // 处理重叠双位数 while (/\\d{2}/.test(result)) { result = result.replace(/\d{2}/g, ''); } console.log(result); // 输出: <strong>TEST</strong><strong>KLO</strong>
方法2:直接匹配法(提取目标内容)
如果你需要直接匹配所有非双位数的内容(而不是替换),可以用带环视的正则来精准匹配:
正则表达式
(?<!\d)\d(?!\d)|[^\d]
正则解释
(?<!\d)\d(?!\d):匹配孤立的单个数字(前后都不是数字,避免把双位数的一部分当成单个数字匹配)|:逻辑“或”[^\d]:匹配所有非数字字符(包括标签、字母、符号等)
示例匹配结果
对于<strong>LOP</strong>10<strong>G7G400</strong>,这个正则会匹配到:<strong>LOP</strong>、<strong>G、7、G、0,拼接后就是除双位数(10、40)外的所有内容:<strong>LOP</strong><strong>G7G0</strong>
注意事项
- 如果你的“双位数”指的是10-99的正两位数(排除前导零),那需要把正则调整为
[1-9]\d,而不是\d{2}。 - 处理重叠双位数(比如
4567)时,单次全局替换只会替换45,剩下67,所以需要循环替换直到没有匹配项。
内容的提问来源于stack exchange,提问作者user3457337
相关产品推荐
相关产品推荐

