2016-10-26 136 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]); 

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

相关问题