JMeter正则表达式提取指定LegCount对应航班详情问题求助
修正JMeter正则表达式提取指定LegCount的航班数据
问题根源分析
你当前的正则表达式存在两个核心问题:
- 闭合标签格式错误:所有
<.a:XXX>写法不符合XML标准,应为</a:XXX>,导致正则无法匹配到正确的标签闭合位置。 - 跨节点匹配风险:原正则使用
[\s\S]+?会无差别匹配任意字符,可能跨越多个<a:FlightSegment>节点,导致无法精准定位到目标LegCount对应的节点。
修正后的正则表达式
去程(匹配<a:LegCount>1</a:LegCount>的航班数据)
<a:FlightSegment>(?:(?!<a:FlightSegment>)[\s\S])*?<a:LegCount>1</a:LegCount>(?:(?!<a:FlightSegment>)[\s\S])*?<a:LFID>(.+?)</a:LFID>(?:(?!<a:FlightSegment>)[\s\S])*?<a:DepartureDate>(.+?)T(.+?)</a:DepartureDate>(?:(?!<a:FlightSegment>)[\s\S])*?<a:FCCode>(.+?)</a:FCCode>(?:(?!<a:FlightSegment>)[\s\S])*?<a:FBCode>(.+?)</a:FBCode>(?:(?!<a:FlightSegment>)[\s\S])*?<a:SegmentDetail>(?:(?!<a:FlightSegment>)[\s\S])*?<a:Origin>(.+?)</a:Origin>(?:(?!<a:FlightSegment>)[\s\S])*?<a:Destination>(.+?)</a:Destination>
返程(匹配<a:LegCount>2</a:LegCount>的航班数据)
<a:FlightSegment>(?:(?!<a:FlightSegment>)[\s\S])*?<a:LegCount>2</a:LegCount>(?:(?!<a:FlightSegment>)[\s\S])*?<a:LFID>(.+?)</a:LFID>(?:(?!<a:FlightSegment>)[\s\S])*?<a:DepartureDate>(.+?)T(.+?)</a:DepartureDate>(?:(?!<a:FlightSegment>)[\s\S])*?<a:FCCode>(.+?)</a:FCCode>(?:(?!<a:FlightSegment>)[\s\S])*?<a:FBCode>(.+?)</a:FBCode>(?:(?!<a:FlightSegment>)[\s\S])*?<a:SegmentDetail>(?:(?!<a:FlightSegment>)[\s\S])*?<a:Origin>(.+?)</a:Origin>(?:(?!<a:FlightSegment>)[\s\S])*?<a:Destination>(.+?)</a:Destination>
关键修正说明
- 修复标签格式:将所有错误的闭合标签
<.a:XXX>替换为标准XML闭合标签</a:XXX>,确保正则能正确识别标签边界。 - 精准节点锁定:使用
(?:(?!<a:FlightSegment>)[\s\S])*?替代原有的[\s\S]+?,该表达式会匹配任意字符,但不会跨越到下一个<a:FlightSegment>节点,确保仅在目标节点内部提取数据。 - 优先定位目标LegCount:调整匹配顺序,先找到目标
<a:LegCount>X</a:LegCount>标签,再提取该节点内的其他字段,避免因节点顺序问题导致的匹配失败。
JMeter提取器设置建议
- 对于去程提取器,设置匹配数字为
1(若仅存在一个LegCount=1的航班),若有多个可设为-1提取所有结果。 - 对于返程提取器,设置匹配数字为
1(对应LegCount=2的航班)。 - 模板设置保持与原正则一致,例如
$1$对应LFID,$2$对应出发日期,$3$对应出发时间等。
内容的提问来源于stack exchange,提问作者Lalmani Kashyap
相关产品推荐
相关产品推荐

