我想解析具有以下格式的UUID的字符串
"<urn:uuid:4324e9d5-8d1f-442c-96a4-6146640da7ce>"
Run Code Online (Sandbox Code Playgroud)
我尝试以下面的方式解析它,但是可以,但是我认为它会很慢
private static final String reg1 = ".*?";
private static final String reg2 = "([A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12})";
private static final Pattern splitter = Pattern.compile(re1 + re2, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更快的方法,并在下面尝试过,但是无法匹配
private static final Pattern URN_UUID_PATTERN = Pattern.compile("^< urn:uuid:([^&])+>");
Run Code Online (Sandbox Code Playgroud)
我是正则表达式的新手。任何帮助表示赞赏。
\阿库拉
您使用更快的正则表达式的示例使用的<是输入所在的位置<,这很令人困惑。
关于速度,首先,您的UUID为十六进制,因此与A-Z而不匹配a-f。其次,您不提供区分大小写的指示,因此请不要使用不区分大小写的字母,并在范围内编写正确的字母。
您无需解释是否需要UUID之前的部分。如果不是,不包括.*?,你可能也写的文字re1和re2你在一起final Pattern。没有迹象表明您也需要DOTALL。
private static final Pattern splitter =
Pattern.compile("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})");
Run Code Online (Sandbox Code Playgroud)
或者,如果您测量正则表达式的性能太慢,则可以尝试另一种方法,例如:在示例中,
每个uuid都以“ uuid:”开头吗?如果可以的话
同样,更快的正则表达式可能是:
private static final Pattern splitter =
Pattern.compile("([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})");
Run Code Online (Sandbox Code Playgroud)
OTOH如果您所有输入的字符串都将以这些确切的字符开头,则无需执行先前建议中的步骤1,只需 input.substring(13, 49);