如何编写正则表达式适配多种段落起始编号匹配场景?
问题与解决方案
需求概述
需要编写正则表达式,提取文本中多种格式的编号并转为[编号1]_ [编号2]的形式,覆盖以下场景:
- 普通数字编号:例如「1) sovereign control will prevail」中的
1 - 层级带点编号:例如「1.1. These are the Rules」中的
1.1、「5.47.1 "Пункт зупинки тролейбуса".」中的5.47.1 - 多编号组合:例如「5.24.1 і 5.24.2 "Зміна напрямку руху на дорозі з розділювальною смугою"」中的
5.24.1和5.24.2
原正则([0-9.,\-\s]+)\b")无法适配多编号场景。
正则实现方案
核心正则表达式
((?:\d+(?:\.\d+)*\s+(?:і|and|&)\s+)*\d+(?:\.\d+)*)(?=\s*")
规则拆解
\d+(?:\.\d+)*:匹配单个合法编号,支持纯数字(1)或多层级带点格式(1.1、5.47.1)(?:\s+(?:і|and|&)\s+)*:匹配多编号之间的连接逻辑,支持乌克兰语「і」、英文「and」、符号「&」,前后允许任意空格,*表示可匹配0次或多次(兼容单/多编号场景)(?=\s*"):正向预查,确保编号后紧跟转义双引号",避免误匹配无关文本
后处理步骤
捕获到编号组合字符串后,将其中的连接符(「і」「and」「&」)替换为_ 即可得到目标格式:
- 示例:捕获到
5.24.1 і 5.24.2,替换后得到5.24.1_ 5.24.2 - 单编号场景:捕获到
1.1,直接保留即可
简化版(单独捕获每个编号)
如果需要单独提取每个编号,可使用:
(?:(\d+(?:\.\d+)*)\s+(?:і|and|&)\s+)*(\d+(?:\.\d+)*)(?=\s*")
此正则会将每个编号分别存入捕获分组,后续将分组内容用_ 拼接即可。
内容的提问来源于stack exchange,提问作者Evgeniy Skiba
相关产品推荐
相关产品推荐

