我必须使用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;
任何人都能为我解释一下吗?谢谢。
答案 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));
}
答案 2 :(得分:1)
看起来第二个左括号(未转义的那个)正在启动一个字符集。也许你需要在空案件周围加括号。
删除括号匹配
Pattern.matches("^(\\[)[a-zA-Z]+(\\d+)(\\])$", "[abc123]")
要包含空案例,请尝试类似
的内容^(\\[\\])|(\\[[a-zA-Z]+\d+\\])$
我将空检查放在另一个地方(使其更明确),但它基本上是相同的正则表达式,没有额外的括号组。