如何用正则匹配指定倍率ATK加成且排除中间含数字的情况?
解决正则错误匹配跨倍数的问题
问题分析
你遇到的核心问题是原正则里的.+属于贪婪匹配,它会从ATK后面开始尽可能多地抓取字符,直到找到最后一个by 1.5x——这就直接跨过了文本里的2.75x,错误匹配到了整个长句子。我们需要做的是:确保ATK和目标的by 1.5x之间,不会出现其他类似2.75x、2.5x的倍数格式。
解决方案:负向预查限制中间内容
这里推荐用**负向预查(Negative Lookahead)**来约束ATK到by 1.5x之间的内容,从根源上避免跨倍数的错误匹配。
正则写法1:禁止中间出现任何「数字+x」格式
Boosts (their )?ATK(?:(?!\d+\.?\d*x).)*by 1.5x
- 拆解解释:
(?:(?!\d+\.?\d*x).)*:这是一个原子组,作用是匹配任意字符,但前提是当前位置之后不会出现「整数/小数+x」的倍数模式。(?!\d+\.?\d*x):负向预查,检查当前位置后面没有1.23x这类倍数格式;.:匹配任意单个字符;*:重复这个检查+匹配的过程,直到遇到by 1.5x。
正则写法2:更严格,禁止中间出现「by + 倍数」完整结构
如果你的场景里,错误匹配都是因为中间存在另一个by Xx的加成项,可以用更精准的规则:
Boosts (their )?ATK(?:(?!by \d+\.?\d*x).)*by 1.5x
这个写法会确保ATK和目标by 1.5x之间,不会出现另一个完整的「by + 倍数」表述,完全杜绝跨加成项的错误匹配。
测试效果
用你的目标文本测试这两个正则:
Boosts ATK of Cerebral characters by 2.75x and chain by 1.5x if HP is below 30% at the start of the turn, boosts ATK of Cerebral characters by 2.5x otherwise
正则会因为中间存在2.75x(或by 2.75x)而拒绝匹配,完全符合你的需求;而如果遇到类似Boosts ATK of Cerebral characters by 1.5x的文本,会正常匹配。
内容的提问来源于stack exchange,提问作者Fabiobreo
相关产品推荐
相关产品推荐

