You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则仅匹配含指定关键词的多行POINT-ENDPOINT块

解决POINT-ENDPOINT块的正则匹配问题

我来帮你搞定这个正则匹配的难题!你的需求是从一堆POINT到ENDPOINT的块里,精准挑出包含 Max的那些块,之前的正则失效是因为逻辑没处理好边界,导致它跨过了不需要的块。

原正则的问题分析

你之前写的POINT=[0-9]*(?s)(.*?)(?!ENDPOINT)(\sMax)(.*?)ENDPOINT有两个关键问题:

  1. (?!ENDPOINT)这个负前瞻放错了位置——它只是检查 Max前面不是ENDPOINT,根本没法阻止正则跨过其他完整的POINT-ENDPOINT块;
  2. 单行模式下的.*?会从第一个POINT开始,一直向后找直到碰到 Max,然后再找ENDPOINT,结果就把第一个不包含 Max的块也一起匹配进去了,自然就得到了整个文本。

正确的正则表达式

我们需要确保正则只在单个POINT-ENDPOINT块内部查找 Max,绝不跨过其他ENDPOINT边界,可以用这个正则:

POINT=\d+(?:(?!ENDPOINT)[\s\S])*?\sMax(?:(?!ENDPOINT)[\s\S])*?ENDPOINT

如果你的正则引擎支持单行模式((?s)),也可以简化成更易读的版本:

(?s)POINT=\d+(?:(?!ENDPOINT).)*?\sMax(?:(?!ENDPOINT).)*?ENDPOINT

正则各部分解释

  • POINT=\d+:匹配每个块的开头,捕获POINT的编号;
  • (?:(?!ENDPOINT)[\s\S])*?:非贪婪匹配任意字符([\s\S]等价于单行模式的.,能匹配换行),但每一步都会检查当前位置后面不是ENDPOINT——这就保证了我们不会跳出当前的POINT块;
  • \sMax:精准匹配空格加Max(避免误匹配像Maxwell这类包含Max但不是目标的字符串);
  • 后面的(?:(?!ENDPOINT)[\s\S])*?ENDPOINT:继续在当前块内非贪婪匹配,直到碰到块的结尾ENDPOINT。

效果验证

用你的示例文本测试的话,这个正则会只匹配第二个包含M_Voltage Phase A-N Max的块,完全忽略第一个没有 Max的块。就算文件里有多个符合条件的块,它也会逐个独立匹配出来,不会串在一起。

内容的提问来源于stack exchange,提问作者Carl Campbell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:04:00