Java 为什么这个正则表达式不能准确地检查?
我有下面的正则表达式方法,它对给定字符串分3个阶段进行匹配。但是由于某种原因,Java 为什么这个正则表达式不能准确地检查?,java,regex,Java,Regex,我有下面的正则表达式方法,它对给定字符串分3个阶段进行匹配。但是由于某种原因,Regex无法检查某些内容。根据我通过工作获得的任何知识,它们似乎是正确的。有人能纠正我的错误吗 我有以下代码: public class App { public static void main(String[] args) { String identifier = "urn:abc:de:xyz:234567.1890123"; if (identi
Regex
无法检查某些内容。根据我通过工作获得的任何知识,它们似乎是正确的。有人能纠正我的错误吗
我有以下代码:
public class App {
public static void main(String[] args) {
String identifier = "urn:abc:de:xyz:234567.1890123";
if (identifier.matches("^urn:abc:de:xyz:.*")) {
System.out.println("Match ONE");
if (identifier.matches("^urn:abc:de:xyz:[0-9]{6,12}.[0-9]{1,7}.*")) {
System.out.println("Match TWO");
if (identifier.matches("^urn:abc:de:xyz:[0-9]{6,12}.[a-zA-Z0-9.-_]{1,20}$")) {
System.out.println("Match Three");
}
}
}
}
}
理想情况下,此代码应该生成输出
Match ONE
Match TWO
Match Three
仅当标识符=“urn:abc:de:xyz:234567.1890123.abd12”时,但如果标识符与正则表达式不匹配,则它会提供相同的输出事件,例如以下输入:
"urn:abc:de:xyz:234567.1890123"
"urn:abc:de:xyz:234567.1890ANC"
"urn:abc:de:xyz:234567.1890123"
"urn:abc:de:xyz:234567.1890ACB.123"
我不明白为什么它允许在
之后使用字母数字字符,而且它也不关心第二个
之后的字符
我希望我的Regex
检查字符串是否具有以下格式:
urn:abc:de:xyz:
234567
)
1890123
)
urn:abc:de:xyz:234567.1890123.ABC123.\u 12
这对于我的正则表达式是无效的字符串,因为它忽略了第6点中的元素:
urn:abc:de:xyz:234567.1890123
对于我的正则表达式来说,这也是一个无效字符串,因为它忽略了第4点的元素(它有ABC而不是十进制数)。
urn:abc:de:xyz:234567.1890ABC.ABC123.\u12
正则表达式的这部分:
匹配6到12位数字,后跟任何字符,后跟1到7位数字[0-9]{6,12}.[0-9]{1,7}
^urn:abc:de:xyz:[0-9]{6,12}\.[0-9]{1,7}\.[a-zA-Z0-9\-_]{1,20}$
这将与字符串末尾的任意数量的点alphanum匹配,例如:
^urn:abc:de:xyz:\d{6,12}\.\d{1,7}(?:\.[\w-]{1,20})+$
请参阅<代码>不仅匹配点字符。它几乎匹配所有内容,因为
在正则表达式中有特殊的含义。这就是为什么最后的*
有效-它意味着(几乎)任何字符都有0次或更多次。@Sweeper我如何确保字符串中有
和所需的字符?我如何修改我的regex
匹配表达式来检查这些东西?@Boristespider感谢您的回复。我如何修改它,使其工作,并检查我需要的东西?我不知道你正在检查什么。。。你到底想匹配什么,你不想匹配什么?但是如果我转义
字符,那么它不会检查是否有
字符?@BATMAN_2008不,如果你转义它,它只会与点完全匹配。否则它将匹配任何非换行符。反斜杠点序列不匹配点。匹配点后,如果不需要再匹配点,可以将其从最后一个方括号中删除。是的,谢谢,这很有效:)