2

我有一个字符串字段。我需要将 UUID 字符串或数字传递给该字段。所以我想使用正则表达式验证这个传递值。

样本 :

stringField = "1af6e22e-1d7e-4dab-a31c-38e0b88de807";
stringField = "123654";

对于我可以使用的 UUID,

"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"

对于我可以使用的数字

"\\d+"

有没有办法在单个正则表达式中使用上述 2 模式

4

4 回答 4

2

|是的..您可以在这两个正则表达式之间使用(OR) ..

[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+
                                                            ^
于 2013-07-05T07:07:55.990 回答
1

你是如何应用正则表达式的?如果您使用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
于 2013-07-05T10:21:15.263 回答
1

尝试:

"(?:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|(?:\\d+)"
于 2013-07-05T07:08:24.193 回答
1

您可以使用 () 对正则表达式进行分组并使用 | 允许替代方案。

所以这将起作用:

(([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12})|(\\d+)

请注意,我已经稍微调整了您的 UUID 正则表达式以允许使用大写字母。

于 2013-07-05T07:14:35.763 回答