2014-03-19 376 views
0

我有一个由3rdParty应用程序提供给我的字符串。我想对它们进行标记并使其成为关键值对。在模式匹配时排除其他模式中的模式

name=\"Student one\" grade=\"fifth grade\" gender=m place=\"some place in this earth\" dob=30/02/1900 enrolled 

预计记号化输出是

name = \"Student one\" 
grade=\"fifth grade\" 
gender=m 
place=\"some place in this earth\" 
dob=30/02/1900 

我不能简单地标记化基础上的空间,因为有\“\”图案,这是我想省略内的一些空间。

上\的2号发生这样的模式匹配“也没有什么帮助,因为我没有性别=米\之间” \”

如何做一个模式匹配基于模式和避免做模式匹配如果输入\之间 “和\”

+0

在文本中是否有实际的反斜杠字符,或者您是否向我们显示没有周围引号的字符串?文本中有 –

+0

反斜杠。这是我从我的图书馆得到的确切文字 –

+0

我可以在{\\“}上做一个模式匹配 - 请注意它是斜线斜杠双引号空间,但是我得到重叠的标记 –

回答

1

如何如下:

(?:\\"[^"\\]*\\"|[^\s\\"])+ 

在Java中,可以像这样(欢迎到Java反斜线地狱)使用

查看一下live on regex101.com

+0

是的反斜杠地狱...我是熟悉它:) –

1

一个基本的方法是使用的开始和双引号(“)的结尾忽略空间,如果一个双引号内

public static void main(String[] args) { 

    String data = "name=\"Student one\" grade=\"fifth grade\" gender=m place=\"some place in this earth\" dob=30/02/1900"; 


    ArrayList<String> list = new ArrayList<String>(); 

    String tmp = ""; 
    int alternate=1; 
    for (int i = 0; i < data.length(); ++i) { 

     if(data.charAt(i)=='\"'){ 
      alternate*=-1; 
     } 
     if(alternate == 1 && (data.charAt(i)==' '||i==data.length()-1)){ 
      list.add(tmp); 
      tmp=""; 
     } 
     tmp+=data.charAt(i)+""; 
     if(tmp.equalsIgnoreCase(" ")){ 
      tmp=""; 
     } 
    } 


    Iterator it = list.iterator(); 

    while(it.hasNext()){ 
     System.out.println(it.next().toString()); 
    } 


} 

输出

name="Student one" 
grade="fifth grade" 
gender=m 
place="some place in this earth" 
dob=30/02/190 
1

你可以试试这个:

String s = "name= \\\"Student one\\\" grade=\\\"fifth grade\\\" gender=m place=\\\"some place in this earth\\\" dob=30/02/1900 enrolled"; 
Pattern pattern = Pattern.compile(
     "\\S+\\s*=\\s*   # Key= with optional spaces around\n" 
     +"(" 
     +"\\\\\"[^\"\\\\]*\\\\\" # capture in between \"...\" \n" 
     +"|      # OR\n" 
     +"\\S+     # non space characters!\n" 
     +")" 
     , Pattern.COMMENTS); 
Matcher m = pattern.matcher(s); 
while (m.find()) { 
    System.out.println(m.group(0)); 
} 

通常情况下,模式如下:为了更好地理解,评论添加在正则表达式:

Pattern pattern = Pattern.compile("\\S+\\s*=\\s*(\\\\\"[^\"\\\\]*\\\\\"|\\S+)");