2016-10-26 134 views
1

我想拆我的查詢,但沒有得到它符合我的要求準確的答案。的Java:分割分號分隔字符串,但忽略逃逸+分號在引號

我有我的字符串如下圖所示:

選擇1;選擇\\ 2;選擇3 \\;複製客戶從 'S3:// mybucket/MYDATA' 憑證 'aws_access_key_id = access_key \\; aws_secret_access_key = SECRET_KEY \\; master_symmetric_key = master_key'

希望的輸出:

選擇1

選擇\\ 2

從選擇3 \\

複製客戶S3:// mybucket/MYDATA'憑證「aws_a ccess_key_id = access_key \\; aws_secret_access_key = secret_key \\; master_symmetric_key = master_key'

我找到了關於escaper的解決方案。但它不符合我的要求。

(?<!\\);

Handling delimiter with escape characters in Java String.split() method

如何忽略逃脫+引號分號?

幫助我。

+0

您在'copy customer'之前也有'\\;'。它和'access_key \\;'沒有區別。無論你使用什麼,計算機都無法區分這兩個'\';'。 – RealSkeptic

回答

0

我tryied另一個sollution,沒有正則表達式這個時候。我有許多奇怪的字符串我能想到的檢查這一點,它的工作,因爲我預計(希望你期望過高這次將工作),請檢查了這一點。

 String s ="select 1;r;select \\2; select 3\\;copy customer from 's3://mybucket/mydata' credentials 'aws_access_key_id=<access-key-id>\\;aws_secret_access_key=<secret-access-key>\\;master_symmetric_ke‌​y=<master-key>'"; 
       //"select 1;r;select \\2; select 3\\;copy customer from 'r;s3://mybucket/mydata;r' credentials 'a_key;b_key;c_key\\;r' 'aws_access_key_id=access_key\\;aws_secret_access_key=secret_key\\;master_symmetric_key=master_key'"; 
     s = s.replace("\\","\\\\"); 
     List<String> tokens = new ArrayList<String>();    
     int i = 0;  
     int j = 0; 
     String backup = s; 
     while (i < s.length()){ 
     char c = s.charAt(i);  
      if(c==';'){ 
      String previous = s.substring(0,i); 
      int quotesBefore = StringUtils.countMatches(backup.substring(0,j), "'"); 
      if(i<2 || quotesBefore==0 || (i>1 && (quotesBefore & 1) == 0 || ((quotesBefore & 1) != 0) && !(s.charAt(i-1)=='\\' && s.charAt(i-2)=='\\'))){//Even quotes before OR (odd quotes AND not \\ right before)     
       tokens.add(previous); 
       if(i>0)s=s.substring(i+1); 
       i=0; 
      } 
      } 
      i++;j++; 
     } 
     tokens.add(s); 
     for(String t : tokens) { 
      System.out.println("> "+t); 
     } 

基本步驟:

  1. Itterate字符串中的字符

  2. 對於每一個檢查,如果它是一個分號

  3. 如果這是真的,拿到之前的字符,計數引用並將這些字符添加到列表中,但前提是這是一個奇數或者它是e ven 數字,但分號不能用「\\」轉義
+0

謝謝!但'''從's3:// mybucket/mydata'憑證複製客戶aws_access_key_id = \\; aws_secret_access_key = <祕密存取鑰匙> \\; master_symmetric_key = ';「'不是加工。 T.T –

+0

修正了!一探究竟。 –

+1

謝謝!它運作良好。 –

1

我認爲這是一個sollution:

String line = "select 1;select \\2; select 3\\;copy customer from 's3://mybucket/mydata' credentials 'aws_access_key_id=access_key\\;aws_secret_access_key=secret_key\\;master_symmetric_key=master_key'"; 
line = line.replace("\\","\\\\");//To avoid missing \ 
String[] tokens = line.split(";(?=([^']*'[^']*')*[^']*$)");//To split on semmicolons, but not those inside quotes 
for(String t : tokens) { 
    System.out.println("> "+t); 
} 

你可以在這裏進行測試 http://rextester.com/MLTA75734

+0

謝謝你的幫助。但是,如果只有分號引號的話,我不想忽略它。 ex)'copy credentials'a_key; b_key; c_key';'所需輸出:'複製憑證'a_key(\ n)b_key(\ n)c_key'(\ n)'(\ n):意思是分割 –

0

您可以通過用戶外部.jar 一樣,公共琅2.6.jar

String str = "select 1;select \\2; select 3\\;copy customer from 's3://mybucket/mydata' credentials 'aws_access_key_id=access_key\\;" 
      + "aws_secret_access_key=secret_key\\;" 
      + "master_symmetric_key=master_key'"; 
    str = StringEscapeUtils.escapeJavaScript(str); // method from external jar 
    String st[] = str.split(";"); 
    for(int i=0;i<st.length;i++) 
    System.out.println(st[i]); 

希望它可以幫助你......

相關問題