java正则表达式匹配问题

时间:2013-12-30 08:47:14

标签: java regex

我必须使用java正则表达式来匹配这样的字符串:[] [a1],[abdf123] ...:

也就是说,里面有一个字符串的括号,这个内部字符串是空的,或者它必须是这样的:aaa123,a12,b34,即一系列字母,然后是一系列数字。< / p>

所以我写这样的正则表达式:

Pattern.matches("^(\\[)[|[a-zA-Z]+(\\d+)](\\])$","[abc123]");

但令我惊讶的是,它返回false。 为了测试[a-zA-Z] +(\ d +)是否可以正确匹配[]中的字符串,我写这样的正则表达式:

Pattern.matches("^[a-zA-Z]+(\\d+)$","abc123");

它返回true;

任何人都能为我解释一下吗?谢谢。

3 个答案:

答案 0 :(得分:1)

我认为您对两种模式[][<optional>]进行了不完整的尝试。您的模式以^(\\[)[|[...;开头; OR中的第一个模式打开两个括号但从不关闭它们。根据您想要实现的分组,OR更精细。

如果您想匹配[][abc123],而不是[abc][123],那么您可以将模式分组在括号,字符和数字中,并匹配0组或一次。

Pattern.matches("^(\\[)([a-zA-Z]+(\\d+))?(\\])$","[abc123]");

它将[abc123]的以下组与输入匹配:

0: [0,8] [abc123]
1: [0,1] [
2: [1,7] abc123
3: [4,7] 123
4: [7,8] ]

答案 1 :(得分:1)

问题是你正在使用一个大字符类[ ... ](这意味着+没有按预期工作)来放置你想要匹配的部分。相反,删除外部方括号和括号,它们是不需要的,可能除了捕获文本(我稍后会把它放在上面)。

Pattern.matches("^\\([[a-zA-Z]+\\d+)?\\]$","[abc123]");

应该返回true。


现在捕捉文字:

Pattern pattern = Pattern.compile("^\\[([a-zA-Z]+\\d+)?\\]$");
Matcher matcher = pattern.matcher("[abc123]");
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

ideone demo

答案 2 :(得分:1)

看起来第二个左括号(未转义的那个)正在启动一个字符集。也许你需要在空案件周围加括号。

删除括号匹配

Pattern.matches("^(\\[)[a-zA-Z]+(\\d+)(\\])$", "[abc123]")

要包含空案例,请尝试类似

的内容
^(\\[\\])|(\\[[a-zA-Z]+\d+\\])$

我将空检查放在另一个地方(使其更明确),但它基本上是相同的正则表达式,没有额外的括号组。