正则表达式需求:提取前置含REST的HAB:后对应代码
解决方法:提取REST后HAB:的有效代码
要准确提取所有HAB:后符合要求的代码(前方必须包含REST,中间可夹杂其他内容),可以使用以下正则表达式(开启全局匹配g修饰符):
(?:^|\bREST\b)(?:(?!HAB:).)*HAB:\s*(\S+)
正则逻辑拆解
(?:^|\bREST\b):匹配文本开头,或者完整的REST单词(\b确保是独立单词,避免匹配类似RESTful的字符串)(?:(?!HAB:).)*:匹配任意字符,直到遇到第一个HAB:(确保我们只捕获每个REST之后的第一个有效HAB:)HAB:\s*:匹配HAB:以及后面的任意空白字符(适配空格或制表符的情况)(\S+):捕获一个或多个非空白字符,也就是HAB:后面的有效代码(直接排除空内容的情况)
你的原正则问题分析
你之前使用的(REST.*?) *(HAB:) (.*?)( |$)存在几个缺陷:
- 重复捕获:当连续出现多个
REST时(比如REST REST REST HAB: 54783-04),每个REST都会触发一次匹配,导致重复捕获同一个代码。 - 空内容捕获:如果
HAB:后面没有有效代码(比如REST HAB:),(.*?)会捕获空字符串,不符合提取有效代码的需求。 - 无单词边界:没有限定
REST为独立单词,可能误匹配包含REST的其他字符串。
测试结果
将这个正则应用到你的测试文本,会得到以下有效代码:
75RF-3729-70D-0175RF-3729-70D-0275RF-3729-70D-0354783-0445923456734
完全符合你排除非REST引导的HAB:(比如CLUE HAB: 234-543)和空内容的需求。
内容的提问来源于stack exchange,提问作者TobSta
相关产品推荐
相关产品推荐

