2012-07-13 83 views
1

我有一个像如何从Java中的字符串(更复杂)创建一个键/值映射

"SimpleKey1: word1. SimpleKey2Word1 SimpleKey2Word2: word word word, word word. word word. CompoundKey3/CompoundKey3: word word word, word. Key3: word. CompoundKey4Word1 CompoundKey4Word2/CompoundKey4Word3 CompoundKey4Word4: word words, words word-word (word 18 word 100). CompoundKey5/CompoundKey5: word word."

文本我需要解析该字符串,为了获得一个键/值映射像:

SimpleKey1: word1. 
SimpleKey2Word1 SimpleKey2Word2: word word word, word word. word word. 
CompoundKey3/CompoundKey3: word word word, word. 
CompoundKey4Word1 CompoundKey4Word2/CompoundKey4Word3 CompoundKey4Word4: word words, words word-word (word 18 word 100). 
CompoundKey5/CompoundKey5: word word. 

请注意,密钥可以包含斜杠字符(/),并且值可以包含特殊字符。

我找不出什么正则表达式我应该使用。

谢谢。

+0

什么标记给定键的值列表的末尾? – m0skit0 2012-07-13 21:54:06

+0

@ m0skit0 - 似乎每个值都以有效键(字母,数字,空格和斜杠)之前的最后一个句点和空格结束。 – 2012-07-13 21:55:42

+2

我们是否应该根据您的示例中的规范进行猜测,或者您能否提供规范? – 2012-07-13 21:55:51

回答

0

尝试这个表达式(.+?)(?=\.\s*(([A-Z])|($)))

4
String data = "SimpleKey1: word1. SimpleKey2Word1 SimpleKey2Word2: word " 
      + "word word, word word. word word. CompoundKey3/CompoundKey3: " 
      + "word word word, word. Key3: word. CompoundKey4Word1 " 
      + "CompoundKey4Word2/CompoundKey4Word3 CompoundKey4Word4: word " 
      + "words, words word-word (word 18 word 100). CompoundKey5/" 
      + "CompoundKey5: word word."; 
Pattern p=Pattern.compile("([\\w\\s/]+):(.*?)(?=$|([\\w\\s/]+):)"); 
Matcher m=p.matcher(data); 
while(m.find()) 
    System.out.println(m.group().trim()); 

输出:

SimpleKey1: word1. 
SimpleKey2Word1 SimpleKey2Word2: word word word, word word. word word. 
CompoundKey3/CompoundKey3: word word word, word. 
Key3: word. 
CompoundKey4Word1 CompoundKey4Word2/CompoundKey4Word3 CompoundKey4Word4: word words, words word-word (word 18 word 100). 
CompoundKey5/CompoundKey5: word word. 

如果你想获得密钥使用m.group(1)。对于您可以使用的值m.group(2) like

while(m.find()){ 
    System.out.println("key=>"+m.group(1)); 
    System.out.println("value=>"+m.group(2)); 
} 
相关问题