我试图在Java中使用分号分割命令。应忽略单引号或双引号中的分号,并根据不在单引号或双引号内的分号分隔命令。
示例命令:echo 'he ; llo' ; echo 'hello;;'
我尝试了以下代码,但命令没有正确拆分:
String[] tokens = cmdline.split(";(?=(?:[^\"\']*\"\'[^\"\']*\"\')*[^\"\']*$)", -1);
当前错误拆分:
echo 'he ; llo' ; echo 'hello;;'
预计会分成:
1) echo 'he ; llo'
2) echo 'hello;;'
答案 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;;']
答案 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;;'