你是如何应用正则表达式的?如果您使用matches()
,您所要做的就是将它们组合在一起,正如@Anirudh 所说:
return myString.matches(
"[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+");
这是有效的,因为matches()
就像正则表达式被包含在一个非捕获组中并锚定在两端一样,如下所示:
"^(?:[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+)$"
如果使用 Matcher 的find()
方法,则必须自己添加组和锚点。这是因为如果字符串的任何子字符串与正则表达式匹配,则find()
返回肯定结果。例如,将匹配,因为与您的正则表达式匹配。"xyz123<>&&"
"123"
"\\d+"
但我建议您无论如何都添加显式组和锚点,无论您使用什么方法。事实上,您可能想要添加 inline 修饰符以不区分大小写:
"(?i)^(?:[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+)$"
这样,任何查看正则表达式的人都可以准确地知道它的含义。他们不必注意到您正在使用该matches()
方法并记住该方法会matches()
自动锚定匹配。(这对于在非 Java 上下文中学习正则表达式的人特别有帮助。世界上几乎所有其他正则表达式风格都find()
默认使用语义,并且没有与 Java 等效的语义matches()
;这就是锚点的用途。)
如果您想知道,该组是必要的,因为交替(|
运算符)在所有正则表达式构造中具有最低优先级。此正则表达式将匹配以UUID开头或以一位或多位数字结尾的字符串。
"^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+$" // WRONG