无法在Java中正确拆分字符串

时间:2017-02-21 03:51:10

标签: java regex

我试图在Java中使用分号分割命令。应忽略单引号或双引号中的分号,并根据不在单引号或双引号内的分号分隔命令。

示例命令:echo 'he ; llo' ; echo 'hello;;'

我尝试了以下代码,但命令没有正确拆分:

String[] tokens = cmdline.split(";(?=(?:[^\"\']*\"\'[^\"\']*\"\')*[^\"\']*$)", -1);

当前错误拆分:

echo 'he ; llo' ; echo 'hello;;'

预计会分成:

1) echo 'he ; llo'
2) echo 'hello;;'

5 个答案:

答案 0 :(得分:1)

如果你想要基本尝试这个

String str = "echo 'he;llo' ; echo 'hello;;'";

    String splitStrArr[] = str.split("\' ; ");

    for (int i = 0; i < splitStrArr.length; i++) {
        System.out.println((i+1) + ")" + splitStrArr[i]);
    }
  

输出:

     

1)回声&#39;他; llo&#39;

     

2)echo&#39; hello ;;&#39;

答案 1 :(得分:1)

尝试使用下面的库OpenCSV

String cmd = "echo 'he ; llo' ; echo 'hello ; ; '";
CSVParser parser = new CSVParser(';', '\''); //params are separator, quoteChar
String[] strings = parser.parseLine(cmd);

答案 2 :(得分:1)

我相信(没有太多证据,我担心)分裂太难了。但是,可以编写正则表达式来标识分号之间的元素,因此您可以find them all。非解析器解决方案是this

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

(如果你把它放到Java字符串文字中,请记住加倍每个反斜杠,因此\\应该变为"\\\\"。)

但是,我仍然认为对于像这样的复杂语言,解析器会更容易。

答案 3 :(得分:1)

请使用以下正则表达式进行拆分;

;(?=([^']*'[^']*')*[^']*$)

它将忽略;之间的任何',因此您的结果将是;

[echo 'he;llo' ,  echo 'hello;;']

感谢 - &gt; https://stackoverflow.com/a/6464500/3641067

答案 4 :(得分:1)

Regex will match any string ending with a semicolon outside single quote

String stringToSearch = "echo 'he ; llo' ; echo 'hello;;'";

Pattern p1 = Pattern.compile("(?:[^\';]+|\'[^\']+\')+");
Matcher m = p1.matcher(stringToSearch);
while (m.find())
{   
    System.out.println(m.group());
}

输出:

echo 'he ; llo'

echo 'hello;;'