2010-05-26 66 views
0

我需要有意識地隔離vCard的每一行並獲取其值。使用正則表達式獲取特定值

例如,我想從X-CUSTOMFIELD獲得「5555」。

到目前爲止,我的想法是:

"X-CUSTOMFIELD;\\d+"

我一直在尋找一些教程,我用什麼函數的使用有點困惑?上面的正則表達式會返回什麼?它會給我整行還是隻是數字部分(5555)?

我在想我得到整行,我可以使用子字符串來獲取數字?

BEGIN:VCARD 
VERSION:2.1 
N:Last;First; 
FN:First Last 
TEL;HOME;VOICE:111111 
TEL;MOBILE;VOICE:222222 
X-CUSTOMFIELD;5555 
END:VCARD 
+0

這個問題可能是有趣的你:http://stackoverflow.com/questions/672704/where-to-find-a-java-library-to-read-vcard-files – 2010-05-26 11:57:00

回答

0
  String customfield; 
      Pattern p = Pattern.compile("X-CUSTOMFIELD;(.+)$"); 
      Matcher m = p.matcher(insertyourcomparestringhere); 

      if (m.find()) customfield = m.group(); 

這應該做的伎倆。字符串自定義字段中只有5555。

+0

「主機」從哪裏來? – David 2010-05-26 11:29:44

+0

這看起來很有前途,謝謝。我要給這個嘗試... geez,這比php更難! – David 2010-05-26 11:37:52

+0

我將其更改爲: Pattern p = Pattern.compile(「X-CUSTOMFIELD; \\ d +」); 這似乎是伎倆! :-D 謝謝! – David 2010-05-26 12:02:46

0

您可以搜索「;」或「:」,並使用java API中的subString()方法...作爲參數,您可以添加從哪裏將子字符串切割。

ALS最終PARAM可以使用row.length-1,如果 「行」 是你的當前行

+0

但我首先需要隔離一行以使用「:」或「;」,對嗎? 每行都有這兩個標點符號中的一個。 – David 2010-05-26 11:22:36

+0

jetz,沒錯。 當我記得它是正確的時候,有一種方法可以一行一行地讀取它......例如「getLine()」。 – poeschlorn 2010-05-26 11:34:35

+0

我認爲這使得vcard總是處於相同順序的假設?此外,還可能存在重複行,例如擁有多個電話號碼或電子郵件地址。 – David 2010-05-26 11:37:13

0

爲什麼不試試下面的正則表達式:

^([^:]+):(.*)$ 

你必須做什麼是逐行讀取vCard數據,則您將有兩個匹配組(前提是表達式正確)

組1將是字段名稱(X-CUSTOMFIELD),組2將是該字段的數據(5555)

你必須對這個正則表達式做一些瑣碎的操作,因爲它可能不是你想要的,但它會讓你接近你想要去的地方。

+0

我的正則表達式創作是沒有辦法的先進的!看起來令人難以置信。獎勵! 我打算先給SchlaWiener的建議吧... – David 2010-05-26 11:43:27

0

電子名片字段的格式爲KEY[;Attribute]:VALUE[;ATTRIBUTE]。它看起來像X-CUSTOMFIELD中的拼寫錯誤,應爲X-CUSTOMFIELD:5555

然後,您可以在每行上使用line.split(":")以獲取鍵和值。

編輯

首先我想從文件中讀取/消息的所有行,並將它們存儲在哈希表鍵/值巴黎(HashMap的是不是可以在Android ..)。使用上面提到的拆分功能將行分割爲一個鍵和一個值部分。

完成此操作後,簡單地詢問哈希表中鍵「X-CUSTOMFIELD」的值,並返回「5555」。 (假設,您更正了vcard格式,我仍然認爲X-CUSTOMFIELD行無效!)

編輯2

如果電子名片允許重複鍵,則仍然可以使用一個散列表作爲內部電子名片模型,但該值應是一個List<String>類型而不是一個String和電子名片值被添加到這份名單中,像:

Hashtable<String, List<String>> vcard = new Hashtable<String, List<String>>(); 
for (String line:lines) { // assuming lines is an array or collection with all rows 
    String keyValuePair = line.split(":"); 
    List<String> values = vcard.get(keyValuePair[0]); 
    if (values == null) { 
    // first value for this key - need to create the list 
    values = new ArrayList<String>(); 
    vcard.put(keyValuePair[0], values); 
    } 
    values.add(keyValuePair[1]); 
} 

(未經測試 - 如果它不編譯,把它當作僞代碼;-))

+0

我確實喜歡這種聲音,安德烈亞斯。 雖然在電話或電子郵件的情況下會有重要的重複;我可以有多個 TEL; HOME; VOICE? 我必須檢查自定義字段,因爲它是有意義的冒號像其他人。 :-) – David 2010-05-26 11:56:37

0
Pattern p = Pattern.compile("X-CUSTOMFIELD;(\\d+)"); 
Matcher m = p.matcher(your_string); 
if(m.find()){ 
    MatchResult mr=m.toMatchResult(); 
    String value=mr.group(1);//this will be 5555 
}