我需要一些帮助。
是否有一种从正则表达式生成唯一ID的常用方法。 我需要创建一个与以下正则表达式匹配的标识符:
[A-N|P-Z|1-9]{10}
我不知道从哪里开始。
此致 LStrike
答案 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的序列。