Java Regex 不一致组 [英] Java Regex inconsistent groups

查看:46
本文介绍了Java Regex 不一致组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请参考以下关于 SO 的问题:

Please Refer to following question on SO:

Java:正则表达式不匹配

我的正则表达式组不一致.我的代码看起来像:

My Regex groups are not consistent. My code looks like:

public class RegexTest {

    public static void main(String[] args) {

        // final String VALUES_REGEX = "^\\{([0-9a-zA-Z\\-\\_\\.]+)(?:,\\s*([0-9a-zA-Z\\-\\_\\.]*))*\\}$";
        final String VALUES_REGEX = "\\{([\\w.-]+)(?:, *([\\w.-]+))*\\}";

        final Pattern REGEX_PATTERN = Pattern.compile(VALUES_REGEX);
        final String values = "{df1_apx.fhh.irtrs.d.rrr, ffd1-afp.farr.d.rrr.asgd, ffd2-afp.farr.d.rrr.asgd}";
        final Matcher matcher = REGEX_PATTERN.matcher(values);
        if (null != values && matcher.matches()) {
            // for (int index=1; index<=matcher.groupCount(); ++index) {
            // System.out.println(matcher.group(index));
            // }

            while (matcher.find()) {
                System.out.println(matcher.group());
            }
        }

    }
}

我尝试了以下组合:

A) 正则表达式为 "^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" 并使用 groupCount() 进行迭代.结果:

A) Regex as "^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" and use groupCount() to iterate. Result:

df1_apx.fhh.irtrs.d.rrr

ffd2-afp.farr.d.rrr.asgd

B) 正则表达式为 ^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" 并使用 matcher.find().结果:没有结果.

B) Regex as ^\{([0-9a-zA-Z\-\_\.]+)(?:,\s*([0-9a-zA-Z\-\_\.]))\}$" and use matcher.find(). Result: No result.

C) 正则表达式为 "\{([\w.-]+)(?:, ([\w.-]+))\}" 并使用 groupCount() 进行迭代.结果:

C) Regex as "\{([\w.-]+)(?:, ([\w.-]+))\}" and use groupCount() to iterate. Result:

df1_apx.fhh.irtrs.d.rrr

ffd2-afp.farr.d.rrr.asgd

D) 正则表达式为 "\{([\w.-]+)(?:, ([\w.-]+))\}" 并使用 matcher.find().结果:没有结果.

D) Regex as "\{([\w.-]+)(?:, ([\w.-]+))\}" and use matcher.find(). Result: No results.

我从来没有得到一致的群体.这里的预期结果是:

I never get consistent groups. Expected result here is:

df1_apx.fhh.irtrs.d.rrr

ffd1-afp.farr.d.rrr.asgd

ffd2-afp.farr.d.rrr.asgd

请告诉我,我怎样才能实现它.

Please let me know, how can I achieve it.

推荐答案

(?<=[{,])\s*(.*?)(?=,|})

您可以简单地使用它并抓取捕获.参见演示.

You can simply use this and grab the captures.See demo.

https://regex101.com/r/sJ9gM7/33

当您有 (#something)* 时,正则表达式引擎只会记住最后一组.您不会以这种方式获得所有组.

When you have (#something)* then only the last group is remembered by the regex engine.You wont get all the groups this way.

这篇关于Java Regex 不一致组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆