2014-08-29 48 views
2

如果字符串中只包含数字,字母(自定义字符串,名称,代码或其他)或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密钥格式的常规字符串。

+2

GAE数据存储区密钥和常规字符串之间有什么区别?什么是GAE密钥格式? – 2014-08-29 09:21:28

+0

http://stackoverflow.com/questions/15864116/regular-expression-for-google-app-engine-entity-keys – xybrek 2014-08-29 09:37:14

+0

因此,Datastore字符串与其他字符串的REGEX相同。我建议两个解决方法,这需要您在调用此方法之前添加代码:(1)向其他字符串添加一个前缀以用作从数据存储字符串标识的标记; (2)使用其原始数据存储区密钥的信息,并将其包含在字符串中。毕竟这是OOP而不是汇编语言。 – user3852065 2014-08-29 14:00:07

回答

1

您提到的情况(第二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}=)?$相匹配。

+0

这里传递的关键字实际上是早期通过GET api传递给客户端的KeyFactor.keyToString的输出,现在当客户端想要获取实体时,它需要传回它为GET(或list方法)获得的String关键字。 – xybrek 2014-08-31 04:49:38

+0

我知道。这正是我所说的:密钥通过Base64编码编码为网页安全的字符串。使用上面的正则表达式来测试这是否是编码密钥。 – 2014-08-31 19:37:59