2014-03-19 421 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+)");