用于区分字符串键的正则表达式
如果字符串中只包含数字,字母(自定义字符串,名称,代码或其他)或GAE键,则需要标识字符串。用于区分字符串键的正则表达式
这里是我的代码:
try {
Class clazz = Class.forName(typeName);
Object one = null;
if(key.matches("[0-9]+")){ // Long
one = store.get(clazz, Long.valueOf(key));
} else if(key.matches("^[0-9A-Za-z._-]{1,500}$")) { // GAE datastore key
one = store.get(clazz, KeyFactory.stringToKey(key));
} else {
one = store.get(clazz, String.valueOf(key));
}
jsonString =new Gson().toJson(one);
} catch (Exception e){
setStatus(Status.SERVER_ERROR_INTERNAL);
e.printStackTrace();
}
这里的问题是,在的if-else第二条语句捕获甚至字符串“AAA”我需要区分从GAE数据存储密钥的一些方法一个不是GAE密钥格式的常规字符串。
您提到的情况(第二if)是用于整个密钥的网页安全编码(不仅是密钥ID)的GAE便利函数:KeyFactory.stringToKey(..)
和KeyFactory.keyToString()
。
正如你可以see from the source,这里使用的编码是web安全的Base64。这是alphabet used。
您可以将其与this regex:^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
相匹配。
这里传递的关键字实际上是早期通过GET api传递给客户端的KeyFactor.keyToString的输出,现在当客户端想要获取实体时,它需要传回它为GET(或list方法)获得的String关键字。 – xybrek 2014-08-31 04:49:38
我知道。这正是我所说的:密钥通过Base64编码编码为网页安全的字符串。使用上面的正则表达式来测试这是否是编码密钥。 – 2014-08-31 19:37:59
GAE数据存储区密钥和常规字符串之间有什么区别?什么是GAE密钥格式? – 2014-08-29 09:21:28
http://*.com/questions/15864116/regular-expression-for-google-app-engine-entity-keys – xybrek 2014-08-29 09:37:14
因此,Datastore字符串与其他字符串的REGEX相同。我建议两个解决方法,这需要您在调用此方法之前添加代码:(1)向其他字符串添加一个前缀以用作从数据存储字符串标识的标记; (2)使用其原始数据存储区密钥的信息,并将其包含在字符串中。毕竟这是OOP而不是汇编语言。 – user3852065 2014-08-29 14:00:07