Java 如何在单个正则表达式中使用两种类型的正则表达式?

Java 如何在单个正则表达式中使用两种类型的正则表达式?,java,regex,Java,Regex,我有一个字符串字段。我需要将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+" 有没有办法在单个正则表达式中使用上述两种模

我有一个字符串字段。我需要将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+"

有没有办法在单个正则表达式中使用上述两种模式?是的。您可以在这两个正则表达式之间使用
(或)

[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+
                                                            ^
尝试:


您可以使用()对正则表达式进行分组,并使用|来允许其他选项

因此,这将起作用:

(([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正则表达式,以允许使用大写字母。

如何应用正则表达式?如果您使用
匹配()
,您所要做的就是按照@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+”
匹配

但是我建议您添加显式组和锚,不管您使用什么方法。事实上,您可能希望添加内联修饰符以区分大小写:

"(?i)^(?:[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+)$"
这样,任何看正则表达式的人都能够准确地知道它的作用。他们不必注意到您正在使用
matches()
方法,并且记住
matches()
会自动锚定匹配。(这对于在非Java环境中学习正则表达式的人来说尤其有用。世界上几乎所有其他正则表达式都默认使用
find()
语义,而Java的
matches()


如果您想知道,这个组是必要的,因为alternation(
|
操作符)在所有正则表达式构造中的优先级最低。这个正则表达式将匹配一个字符串,该字符串以看起来像UUID的东西开头,或以一个或多个数字结尾

 "^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+$"  // WRONG

为什么不试着用
UUID.fromString()
解析,如果失败了,就用
new biginger()
?更简单,不需要regexes@fge在这一点上,找到了。这与您正在寻求解析的事实无关UUIDs@Ryaminal-只是想成为一个多平台的人。为什么所有的帕伦人?所有需要捕捉的就是结果
.group()
就足够了。@fge您的确是对的,但我喜欢让正则表达式尽可能可移植。请随意编辑我的答案;包括一个特定于Java的替代方案。我不认为在这里考虑可移植性?你能详细说明一下吗?据我所知,所有正则表达式引擎都有返回匹配文本的能力……我是@fge的;我不知道有什么正则表达式风格需要你像现在这样使用组。我认为这行不通。你需要用括号来分组。这只是让最后一组或者是一组12个字母数字,或者是多个数字。不过,我可能完全错了。@Ryaminal我猜op只想验证输入。.他不想要组。.op应该对此进行澄清,强制开始和结束锚定,如果存在看起来像uuid或数字的子字符串,Alan正在防止意外匹配。e、 g.
这不是一个有效的匹配-12345678
将在没有锚的情况下返回true+1.考虑周全
 "^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}|\\d+$"  // WRONG