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 循环的结果将只为您提供 first
和 third
。
由于这可能不是您所期望的,因此考虑其他可能性,例如仅搜索值(此处不进行单独检查):
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:正则表达式不匹配的主要内容,如果未能解决你的问题,请参考以下文章