【问题标题】:Java: Regex not matchingJava:正则表达式不匹配
【发布时间】:2015-06-03 05:34:29
【问题描述】:

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

我的代码如下:

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 条件总是返回 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

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

【问题讨论】:

  • 您不允许在字符串中使用空格。
  • matcher.find 用于在输入字符串中多次查找您的正则表达式(在您的情况下只有一个匹配项)。 matcher.group() 提供整个比赛以访问各个组使用matcher.group(int index)

标签: java regex string match comma


【解决方案1】:

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

// [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));

【讨论】:

  • 您好,感谢您对 groupCount() api 的提示。效果很好。
  • 你好汤姆斯,我试过了。但是使用您提供的新正则表达式。使用 groupCount() API 后,我总是得到备用值。当我使用 matcher.find() 时,它失败了。有什么想法,怎么了?
  • 您好,为此主题创建了新问题。期待您的反馈:stackoverflow.com/questions/29374226/…
  • @user613114 你试过注意:下面的例子吗。我用你的例子和其他值试过这个,它确实有效。
【解决方案2】:

在您的输入字符串中逗号后面有一个空格。

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

【讨论】:

  • 对于一个或多个逗号分隔的字符串,请使用 "^\\{[0-9a-zA-Z\\-\\_\\.]+(?:,\\s*([0-9a-zA-Z\\-\\_\\.])+\\}$"
  • 谢谢。使用答案匹配中提供的正则表达式现在可以工作。但是为什么 matcher.find() 失败了?我清楚地看到了两组。我用这些细节更新了我的问题。
  • 您好尝试了新的正则表达式。但逗号也被视为字符串值的一部分。使用代码 sn-p 更新问题。如何只找到匹配的字符串值?
  • 试试regex101.com/r/vV4zX8/6。如果输入是 {foo,bar,buz,foobar} ,你的输出是什么?最好把它作为一个新问题来问,因为编辑太多了。
  • 您好,我很抱歉,因为我的最新更新显示了不正确的正则表达式。但是我使用您提供的正则表达式仅用于我的测试。再次更新问题。您提供的链接显示正确匹配。但不确定为什么我的代码显示不正确的输出。然后我将为此问题创建新问题。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多