matcher.find()返回false,它应该返回true

时间:2016-02-19 10:34:11

标签: java regex

我必须使用regex解析以下类型的字符串:

(alphanumeric word having 3 letters)(hyphen)(alphabetical word having 2 letters)(hyphen)(digits[minimum 1 digit])

我已经为它编写了以下代码:

Pattern p = Pattern.compile("/([A-Z0-9]){1,3}(-)([A-Z]){2}(-)([0-9]){1,}/");
Matcher m = p.matcher("AB3-EF-52825");
System.out.println("matched or not>"+m.find());

我使用http://regexr.com/创建了正则表达式。 enter image description here

理想情况下,m.find()应该打印true字符串足以填充正则表达式,但有些打印false。我没有得到什么问题!谢谢!

3 个答案:

答案 0 :(得分:5)

Pattern周围的正斜杠被解释为文字斜杠。

删除它们。

此外,永远不要信任在线网站,使用Java进行测试和调试。

您的工作Pattern

Pattern p = Pattern.compile("([A-Z0-9]){1,3}(-)([A-Z]){2}(-)([0-9]){1,}");

注意

括号内的每个项目都分配了一个组,用于反向引用。

如果您没有为他们检索反向引用,则可能不需要对所有项目进行分组:

Pattern p = Pattern.compile("[A-Z0-9]{1,3}-[A-Z]{2}-[0-9]{1,}");

答案 1 :(得分:5)

您不需要Java中的正则表达式分隔符。使用:

Pattern p = Pattern.compile("([A-Z0-9]){1,3}-([A-Z]){2}-([0-9])+");

而不是:

Pattern p = Pattern.compile("/([A-Z0-9]){1,3}(-)([A-Z]){2}(-)([0-9]){1,}/");

答案 2 :(得分:1)

只需从模式的开头和结尾删除/即可。这用于PHP,Perl和Unix,但不用于Java。

使用

Pattern p = Pattern.compile("([A-Z0-9]){1,3}(-)([A-Z]){2}(-)([0-9]){1,}");

的工作原理。

This website works for Java regexes