Java: 正则表达式不匹配

Java: Regex not matching

我有逗号分隔的字符串值。每个字符串都可以包含字符或数字以及“-”或“/”或“.”。

我的代码如下:

final String VALUES_REGEX = "^\{([0-9a-zA-Z\-\_\.])+,*([0-9a-zA-Z\-\_\.])*\}$";
final Pattern REGEX_PATTERN = Pattern.compile(VALUES_REGEX);
final String values = "{df1_apx.fhh.irtrs.d.rrr, ffd1-afp.farr.d.rrr.asgd}";
final Matcher matcher = REGEX_PATTERN.matcher(values);
if (null != values && matcher.matches()) {
    // further logic
}
...
...

此处 if 条件总是 returns false 值,因为正则表达式匹配失败。我使用 regexper 验证了正则表达式。看起来不错。

你能告诉我这里有什么问题吗?

更新:使用 Avinash 提供的正则表达式,匹配有效。但是发现组失败了。代码如下:

final String VALUES_REGEX = "^\{([0-9a-zA-Z\-\_\.])+,*\s*([0-9a-zA-Z\-\_\.])*\}$";
final Pattern REGEX_PATTERN = Pattern.compile(VALUES_REGEX);
final String values = "{df1_apx.fhh.irtrs.d.rrr, ffd1-afp.farr.d.rrr.asgd}";
final Matcher matcher = REGEX_PATTERN.matcher(values);
if (null != values && matcher.matches()) {
        while (matcher.find()) {
            System.out.println(matcher.group());
        }
}
...
...

更新:在 Avinash 提供新的正则表达式后,试图找到单独的组。但是逗号也被认为是字符串的一部分。代码如下:

final String VALUES_REGEX = "^\{([0-9a-zA-Z\-\_\.]+)((?:,\s*[0-9a-zA-Z\-\_\.]*)*)\}$";
final Pattern REGEX_PATTERN = Pattern.compile(VALUES_REGEX);
final String values = "{df1_apx.fhh.irtrs.d.rrr, ffd1-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));
    }
}
...
...

输出为:

df1_apx.fhh.irtrs.d.rrr

, ffd1-afp.farr.d.rrr.asgd

我只需要找到匹配的字符串值。

您输入的字符串中逗号后有一个 space。

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

IntelliJ 能够使用此正则表达式匹配您的示例字符串:

^([0-9a-zA-Z_\-\.])+([,]*)([0-9a-zA-Z_\-\.])*$

您可以按如下方式简化您的正则表达式:

// [a-zA-Z0-9_] -> \w
final String VALUES_REGEX = "\{([\w.-]+)(?:, *([\w.-]+))*\}";

注意:如果您使用 Matcher.matches,则不需要 ^$,因为它匹配整个字符串。

编辑: 正则表达式已更新以单独匹配组。

for (int i=1; i<=matcher.groupCount(); ++i) System.out.println(matcher.group(i));

注: 前面示例中的重复捕获组将仅捕获最后一个匹配项,因此如果将模式应用于值 "{first, second, third}",for 循环的结果将得到 firstthird只有.

由于这可能不是您所期望的,考虑到其他可能性,例如仅搜索值(此处不进行单独检查):

final Matcher matcher = Pattern.compile("[\w.-]+").matcher(values);
while (matcher.find()) System.out.println(matcher.group());

或者也只是拆分字符串。

String[] strings = values.substring(1, values.length() - 2).split(", *");
System.out.println(Arrays.toString(strings));