為了寫一個用來操作Redis的RESTful API,需要把輸入的命令字符串拆分為數組,內部使用jedis庫實現Redis操作,遇到的問題是拆分時,引號內的內容怎樣在拆分時視作一個整體。
下面是一段示例代碼
String line = "hmset user:1 name zlikun ctime \"2017-9-1 12:00:00\" utime \"2017-9-18 14:27:00\"" ;
// 目標:將命令拆分為數組,但引號內的內容不能拆分,效果如下:
// [hmset ,user:1 ,name ,zlikun ,ctime ,2017-9-1 12:00:00 ,utime ,2017-9-18 14:27:00]
// 錯誤示例,按空白字符(這里主要針對空格)拆分,日期被拆成兩部分了!
// hmset, user:1, name, zlikun, ctime, "2017-9-1, 12:00:00", utime, "2017-9-18, 14:27:00",
Arrays.stream(line.split("\\s+")).forEach(s -> {
System.out.print(s + ", ");
});
// 正確示例 。。。
補充答案(2017/9/19 16:23) 經過測試,我使用正則實現了同樣結果
String line = "hmset user:1 name zlikun ctime \"2017-9-1 12:00:00\" utime '2017-9-18 14:27:00' description \"I'm a good boy !\"" ;
Pattern pattern = Pattern.compile("('(.*?)'|\"(.*?)\"|\\S+)") ;
Matcher matcher = pattern.matcher(line) ;
while (matcher.find()) {
String text = null ;
for (int i = matcher.groupCount(); i > 0; i--) {
text = matcher.group(i) ;
if (text != null) break;
}
System.out.print(text + ", ");
}
System.out.println();
// hmset, user:1, name, zlikun, ctime, 2017-9-1 12:00:00, utime, 2017-9-18 14:27:00, description, I'm a good boy !,
2 回答

qq_花開花謝_0
TA貢獻1835條經驗 獲得超7個贊
如果只是針對你這種情況,手寫個簡單的狀態機就好了呀:
/**
* Created by krun on 2017/9/19.
*/
public class Main {
public static void main(String ...args) {
String line = "hmset user:1 name zlikun ctime \"2017-9-1 12:00:00\" utime \"2017-9-18 14:27:00\"" ;
List<String> list = new LinkedList<>();
boolean IS_STRING = false;
StringBuilder builder = new StringBuilder();
for (char c : line.toCharArray()) {
switch (c) {
case ' ':
if (IS_STRING) {
builder.append(c);
} else {
list.add(builder.toString());
builder.setLength(0);
}
break;
case '"':
IS_STRING = !IS_STRING;
break;
default:
builder.append(c);
}
}
list.add(builder.toString());
for (String s : list) {
System.out.println(s);
}
}
}
/**
* hmset
* user:1
* name
* zlikun
* ctime
* 2017-9-1 12:00:00
* utime
* 2017-9-18 14:27:00
*/
添加回答
舉報
0/150
提交
取消