优化正则表达式以精准匹配巴西葡萄牙语立法引用
巴西葡萄牙语立法引用正则表达式优化方案
问题概述
需要匹配巴西葡萄牙语的立法引用,有效格式包括:
- Lei 11.738/2008
- Lei nº 9.394/96
- Lei Estadual nº 6.834
- Lei 5.539/2009
- Decreto 30.825/2002
- Lei 1614 de 21 de janeiro de 1990
- art. 1.039 do CPC/2015
- lei nº. 1.060/50
- art.334, § 5º do CPC
- artigo 85, §11º, do CPC
现有正则存在以下问题:
- 捕获无效内容(如
lei nº.、lei.、CPC.) - 误捕引用末尾的句号(如
LEI FEDERAL Nº 11.738/2008.) - 无法匹配部分有效格式
优化后的正则表达式
(?<LEGISLACAO>(?:art(?:\.|igos?)\s*[\d\.º]+(?:,\s*(?:caput|§)\s*[\dº]*)*\s*d[oa]\s+)*?(?:(?:lei(?:\s+(?:estadual|nacional|federal))?|decreto|N?CPC)\s*(?:n[º\.])?\s*[\d\.\/º]+)(?:\s*de\s*\d{1,2}\s*de\s*(?:janeiro|fevereiro|março|abril|maio|junho|julho|agosto|setembro|outubro|novembro|dezembro)\s*de\s*\d{2,4})?)(?=\s|$|\.|\,|\;|\:)
关键改进点
1. 避免无效内容捕获
- 将可选的编号前缀规则改为
(?:n[º\.])?,确保只有完整的前缀(如nº、n.、nº.)才会被匹配,且后面必须紧跟有效编号,不会单独捕获lei nº.这类无编号的无效内容。 - 通过整体结构约束,确保编号部分
[\d\.\/º]+至少包含一个数字,避免匹配lei.或CPC.这类空引用。
2. 防止误捕末尾标点
- 添加正向预查
(?=\s|$|\.|\,|\;|\:),确保匹配结束位置是空白、字符串结尾或常见标点符号,但不会把标点包含在匹配结果中,解决误捕末尾句号的问题。
3. 支持更多有效格式
- 在条款(art)部分:
- 允许
art.和数字之间无空格(如art.334),将固定空格\s改为可选空格\s*。 - 支持多章节引用(如
, §11º),调整为(?:,\s*(?:caput|§)\s*[\dº]*)*,允许重复的章节项,兼容仅caput无编号的场景。 - 允许
do前有逗号(如artigo 85, §11º, do CPC),调整结构适配此类格式。
- 允许
- 支持
nº.这类前缀变体(如lei nº. 1.060/50),通过(?:n[º\.])?覆盖所有合法前缀形式。
测试覆盖效果
- 有效匹配:所有示例格式,包括之前无法匹配的
lei nº. 1.060/50、art.334, § 5º do CPC、artigo 85, §11º, do CPC。 - 拒绝无效:
lei nº.、lei.、CPC.不会被捕获。 - 排除末尾标点:
LEI FEDERAL Nº 11.738/2008.仅匹配到LEI FEDERAL Nº 11.738/2008。
内容的提问来源于stack exchange,提问作者celsowm
相关产品推荐
相关产品推荐

