2016-10-26 5 views
1

Я хочу разделить мой запрос, но не получил ответ, который точно соответствует моим требованиям.Java: разделение строки, разделенной точкой с запятой, но игнорирование escape + точки с запятой в кавычках

У меня есть строка, как показано ниже:

выберите 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»

Я нашел решение о беглеца. Но это не соответствует моему требованию.

(? <! \\);

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

Как игнорировать бежать + точка с запятой в кавычках?

Помогите мне.

+0

У вас также есть '\\' перед клиентом копирования. Нет никакой разницы между этим и 'access_key \\;'. Независимо от того, что вы используете, компьютер не может отличить эти два '\\;'. – RealSkeptic

ответ

0

Я попробовал другое решение, на этот раз не было регулярного выражения. Я проверил это с таким количеством странных строк, о которых я мог подумать, и это сработало, как я ожидал (надеюсь, он будет работать так, как вы ожидаете, на этот раз), пожалуйста, проверьте это.

 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' credentials 'aws_access_key_id = \\; aws_secret_access_key = <секретный ключ доступа> \\; master_symmetric_key = '; "' is not за работой. T.T –

+0

Исправлено это! Проверьте это. –

+1

Спасибо! Это хорошо работает. –

1

Я думаю, что это гуманное:

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';' Желаемый вывод: 'copy credentials 'a_key (\ n) b_key (\ n) c_key' (\ n)' (\ n): mean split –

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]); 

Надеюсь, это поможет вам ...

Смежные вопросы