正则表达式优化需求:匹配LONG字段后忽略行内后续内容
正则表达式提取字段解决方案
问题分析
需要从数据行中提取TYPN、LAT、LONG三个字段,不管行尾是否存在GRIDREF额外信息,匹配到LONG字段后立即忽略该行后续内容,避免跨行匹配。
原有正则的问题
- 原正则使用了
(?si)单行模式,导致无GRIDREF时,.*?会跨行匹配到下一行的GRIDREF,出现错误匹配 - 尝试用
\S*?匹配LONG字段时,因为惰性匹配的特性,可能无法完整捕获LONG的有效值
修正后的正则方案
方案一(兼容字段含空格的情况)
$re = [regex]'TYPN:(?<type>.*?)\sLAT:(?<lat>.*?)\sLONG:(?<long>.*?)(?=\sGRIDREF|$)'
- 去掉了单行模式标记
s,确保.不会匹配换行符,避免跨行 - 使用正向预查
(?=\sGRIDREF|$),让LONG字段的匹配在遇到GRIDREF或者行尾时立即停止,既不会包含GRIDREF内容,也不会跨行
方案二(字段不含空格时更高效)
如果TYPN、LAT、LONG字段本身都不包含空格,用\S+代替.*?可以减少回溯,提升匹配效率:
$re = [regex]'TYPN:(?<type>\S+)\sLAT:(?<lat>\S+)\sLONG:(?<long>\S+)'
\S+匹配任意非空白字符,直接到下一个空格为止,自然避开后续的GRIDREF内容,同时不会跨行
测试验证
- 含GRIDREF的行:
TYPN:ABC LAT:12.34 LONG:56.78 GRIDREF:XYZ123→ 提取结果:type=ABC、lat=12.34、long=56.78 - 不含GRIDREF的行:
TYPN:DEF LAT:98.76 LONG:54.32→ 提取结果:type=DEF、lat=98.76、long=54.32
内容的提问来源于stack exchange,提问作者Derek B
相关产品推荐
相关产品推荐

