用于UUID的java正则表达式

时间:2016-06-03 13:29:43

标签: java regex

我想解析一个具有以下格式的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:([^&])+&gt");

我是regex的新手。 任何帮助表示赞赏。

\ Aqura

2 个答案:

答案 0 :(得分:4)

首先,示例UUID的最后一部分是11个字符,而不是12.因此它不会与您的模式中的字符匹配。

关于速度,首先,您的UUID是十六进制的,因此不要与A-Z匹配,而是与a-f匹配。其次,你没有表明案件是混合的,所以不要使用不区分大小写,并在范围内写出正确的案例。

您无法解释是否需要UUID之前的部分。如果没有,请不要包含.*?,您也可以在re1中一起写re2final 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 = "&lt;urn:uuid:4324e9d5-8d1f-442c-96a4-6146640da7ce&gt;";
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。 复制数组是一个非常快速的操作。