Java:正则表达式不匹配

Posted

技术标签:

【中文标题】Java:正则表达式不匹配【英文标题】:Java: Regex not matching 【发布时间】: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) 【参考方案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() 时,它失败了。有什么想法,怎么了? 您好,为此主题创建了新问题。期待您的反馈:***.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_\-\.])*$

【讨论】:

以上是关于Java:正则表达式不匹配的主要内容,如果未能解决你的问题,请参考以下文章

java正则表达式,怎么匹配空白行

(java中)匹配IP的正则表达式的

正则表达式在 C# 中匹配,但在 java 中不匹配

请问JAVA中正则表达式匹配怎么实现的!

Java中的正则表达式

Java:正则表达式不匹配