【发布时间】:2016-06-03 13:29:42
【问题描述】:
我想解析一个 UUID 格式如下的字符串
"<urn:uuid:4324e9d5-8d1f-442c-96a4-6146640da7ce>"
我已经尝试用下面的方式解析它,但我认为它会很慢
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);
我正在寻找一种更快的方法并在下面尝试过,但它无法匹配
private static final Pattern URN_UUID_PATTERN = Pattern.compile("^< urn:uuid:([^&])+>");
我是正则表达式的新手。 任何帮助表示赞赏。
\阿库拉
【问题讨论】:
-
等等,您的数据中有
&lt;...,但在您的正则表达式中使用^<...?那是行不通的。 -
提示:如果性能确实是个问题 - 请记住 UUID 的结构是固定的。它有固定的长度、固定的子字段等等。因此,使用对 substring() 的调用只是“编码工作”,例如“删除”您正在寻找的基本部分。然后您只需要检查输入的初始长度......换句话说:您搜索“uuid:”;然后你“substring()”冒号后面的 36 个字符;并从那里分开。
-
您的
reg2错误。 UUID 是一个十六进制数字,因此只有字母 A 到 F。任何其他字母都是错误的。 -
如果字符串的格式始终相同,即
"&lt;urn:uuid:<actual uuid>&gt;",则表达式不会太复杂:&lt;urn:uuid:(.*)&gt;(或者甚至可能是uuid:([a-f0-9\-]+)。 -
“但是我认为它会很慢” 你为什么这么认为?你真的测量过吗?