2014-08-29 21 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

相關問題