我想解析一个具有以下格式的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:([^&])+>");
我是regex的新手。 任何帮助表示赞赏。
\ Aqura
答案 0 :(得分:4)
首先,示例UUID的最后一部分是11个字符,而不是12.因此它不会与您的模式中的字符匹配。
关于速度,首先,您的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}){3}-[a-f0-9]{11})");
或者,如果你正在测量你的正则表达式的表现太慢,你可能会尝试另一种方法,例如,每个uuid前面都有&#34; uuid:&#34;在你的例子中?如果是这样,你可以找到&#34; uuid的第一个索引:&#34; as i ,然后子串0到 i +5 [假设你需要它],substring i +5到 i +40,如果我算得那么。
答案 1 :(得分:0)
如果不更改此格式。 我认为更快的方法是使用String.substring()方法。 例如:
String val = "<urn:uuid:4324e9d5-8d1f-442c-96a4-6146640da7ce>";
String sUuid = val.substring(13, 49);
UUID uuid = UUID.fromString(sUuid);
Inside class String在包java.lang.String中使用char数组作为商店数据:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
...
113: /** The value is used for character storage. */
114: private final char value[];
...
}
方法'String substring(int beginIndex,int endIndex)'从头到尾创建数组元素的副本,并在新数组的基础上创建新的String。 复制数组是一个非常快速的操作。