Java:从正则表达式生成唯一ID

时间:2014-07-03 12:20:11

标签: java regex uniqueidentifier

我需要一些帮助。

是否有一种从正则表达式生成唯一ID的常用方法。 我需要创建一个与以下正则表达式匹配的标识符:

[A-N|P-Z|1-9]{10}

我不知道从哪里开始。

此致 LStrike

3 个答案:

答案 0 :(得分:1)

从正则表达式的定义生成与特定正则表达式匹配的字符串。我会将正则表达式解析为其自动机(图表)。然后走自动机,类似于正则表达式匹配器的工作方式,但不是匹配,而是让它写出它遍历的边缘。

看看http://hackingoff.com/compilers/regular-expression-to-nfa-dfa,并给它你的正则表达式。然后它将绘制我所指的图形。

为你寻找互联网,我找到了一个可以从regexp生成自动机的开源java库。因此,您可以使用它来帮助您入门:http://www.brics.dk/automaton/

看起来http://code.google.com/p/xeger会为你做这件事。

答案 1 :(得分:1)

如果您不需要动态更改正则表达式并且您不需要随机性,我只需创建一个方法,将ID从1111111111开始调度到ZZZZZZZZZZ。

答案 2 :(得分:1)

您无法保证构造的唯一性,因为有限数量的有效ID可以满足该正则表达式;所以你应该在使用之前检查它是否确实是唯一的。我假设您要生成非顺序ID(即AAAAAAAAAB后不需要AAAAAAAAAA)。

可能的代码:

string generateID(String valid, int length, Random r) {
    StringBuilder sb = new StringBuilder();
    while (sb.lengh() < length) {
        sb.append(valid.get(r.nextInt(valid.length()));
    }
    return sb.toString();
}

将正则表达式转换为包含所有有效字符(上面为valid参数)的字符串,需要解析正则表达式;但假设它的格式为[ 列表的列表 ]{ 字符数 },正如预期的那样在上面,您可以获取字符列表并查看哪些是有效的:

String generateFromRegex(string regex, Random r) {
   String charsRegex = regex.replaceAll("[{].*", ""); // strip off repetition count
   StringBuilder valid = new StringBuilder();
   final Charset charset = Charset.forName("US-ASCII"); // assume us-ascii
   for (int i = 0; i < 255; i++) {
     ByteBuffer bb = ByteBuffer.allocate(4);
     bb.putInt(i);
     String charString = new String(bb.array(), charset).trim();
     if (charString.length() == 1 && charString.matches(charsRegex)) {
        valid.append(charString);
     }
   }
   int length = Integer.parseInt(
                  regex.replaceAll(".*[{]", "").replaceAll("}", ""));
   return generateID(valid, length, r);
}

请注意,Random实例是外部提供的,因为您希望对所有调用使用相同的实例。如果您为每次调用使用new Random(),那么如果您连续多次调用,很可能会生成相同“唯一”ID的序列。