正则表达式捕获的文本多于其需要

叛逆猫

我想得到整个值 97.47 但正则表达式将其除以 9 并除以 7.47 将其添加到不同的字段这是使用的正则表达式

private static final Pattern COMMISSION_PATTERN =
            Pattern.compile(
                    "(total\\[((?:(?<totalFixed>\\d+)(\\s*(\\+)\\s*)?)?" +
                    "((?<totalPercent>\\d+(\\.\\d{1,2})?)\\s*%)?" +
                    "(\\s*min\\s*(?<totalMin>\\d+))?" +
                    "(\\s*max\\s*(?<totalMax>\\d+))?" +
                    "(\\s*round\\s*(?<totalRound>\\d+))?)?\\])?(\\s*)" +
                    "(partner\\[(?:(\\s*negative:\\s*(?<partnerNegative>(true|false))?\\s*,\\s*)?" +
                    "((?<partnerFixed>\\d+)(\\s*(\\+)\\s*)?)?" +
                    "((?<partnerPercent>\\d+(\\.\\d{1,2})?)\\s*%)?" +
                    "(\\s*min\\s*(?<partnerMin>\\d+))?" +
                    "(\\s*max\\s*(?<partnerMax>\\d+))?" +
                    "(\\s*round\\s*(?<partnerRound>\\d+))?" +
                    "(\\s*mode\\s*(?<partnerMode>\\w+))?)?\\])?");

以下值到达方法“total[0] partner[97.47%]”,它以这种方式解析:

String sCommission = "total[0] partner[97.47%]";
for (String comm : sCommission.split("\n")) {
     Matcher matcher = COMMISSION_PATTERN.matcher(comm.trim());
     if (matcher.matches()) {
String sPartnerFixed = matcher.group("partnerFixed");//9
String sPartnerPercent = matcher.group("partnerPercent"); //7.47

它应该是:

String sPartnerFixed = matcher.group("partnerFixed"); //null
String sPartnerPercent = matcher.group("partnerPercent"); //97.47

我无法弄清楚正则表达式中的错误在哪里

维克多·斯特里比尤夫

(\s*(\+)\s*)?在部分((?<partnerFixed>\d+)(\s*(\+)\s*)?)?的部分是可选的,并且\d+将在partnerFixed组变为“相邻”(也可以回溯到)与(?<partnerPercent>\d+(?:\.\d{1,2})?)正则表达式(其中的一部分\d+也是必要的,相匹配的一个或多个数字)。因此,您的这种行为是意料之中的,除非您告诉正则表达式引擎在这两个数字匹配部分之间明确具有强制性模式。

一个可能的解决方案是\d+(?<partnerFixed>\d+)部分之后添加一个单词边界,即替换"((?<partnerFixed>\\d+)(\\s*(\\+)\\s*)?)?""((?<partnerFixed>\\d+\\b)(\\s*(\\+)\\s*)?)?"

解决此问题的更复杂和更精确的方法是使(\s*(\+)\s*)?模式的某些部分成为必需的。也就是说,partnerFixed如果有一个可选的连续数字.和一个或两个数字,您不希望匹配如果有一个partnerFixed数字,它和下一个值应该用什么分隔?我认为应该有一个空格或+用可选的空格包围,只是从模式中推断出来。

在后一种情况下,您可以替换"((?<partnerFixed>\\d+)(\\s*(\\+)\\s*)?)?""((?<partnerFixed>\\d+)(\\s+|\\s*\\+\\s*))?".

请参阅此正则表达式演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章