如何编写正则表达式提取行首或带Number:前缀的编号字符串
正确正则实现
通用兼容方案(适配所有主流正则引擎,无需分支重置支持)
正则表达式:
^\s*(?:.*Number: (\S+)|(\S+))
需要开启 多行模式(m) 匹配,最终提取结果取捕获组1和捕获组2中非空的那个值即可。
如果一行可能存在多个Number: 前缀,需要取第一个出现的对应编号,将.*替换为非贪婪匹配.*?即可:
^\s*(?:.*?Number: (\S+)|(\S+))
简化方案(支持分支重置的引擎可用,如PCRE、Python regex库、Java 9+)
正则表达式:
^\s*(?|.*Number: (\S+)|(\S+))
同样开启多行模式,直接取捕获组1的值即可。
匹配逻辑说明
- 优先级设置:优先匹配整行中带
Number:前缀的编号,只有当行内不存在该前缀时,才回退匹配行首第一个非空白字符序列,完美适配两种场景需求。 - 行首
\s*兼容行开头存在空格/缩进的情况,符合对“行首第一个非空白序列”的定义。 - 每行只会产生1次匹配,不会出现多匹配、错误提取行首无关单词的问题。
示例匹配结果
针对给出的三行测试用例,匹配结果如下:
ABC123 bla bla→ 提取到ABC123Number: ABC123 bla bla→ 提取到ABC123Some words 123 Number: ABC123 bla bla→ 提取到ABC123
内容的提问来源于stack exchange,提问作者mkczyk
相关产品推荐
相关产品推荐

