我需要從該流中解析看起來像這樣的代碼行:command "string1" "string2"
字符串可以包含空格和轉義雙引號。我需要分割它,以便獲取命令,string1和string2作爲數組元素。我認爲分裂()與正則表達式匹配"
但不是\"
(.split("(?<!\\\\)\"")
)會做這項工作,但我聽說這不是一個好主意。如何解析可包含轉義雙引號的雙引號分隔字符串
有沒有更好的方式在Java中做到這一點?
我需要從該流中解析看起來像這樣的代碼行:command "string1" "string2"
字符串可以包含空格和轉義雙引號。我需要分割它,以便獲取命令,string1和string2作爲數組元素。我認爲分裂()與正則表達式匹配"
但不是\"
(.split("(?<!\\\\)\"")
)會做這項工作,但我聽說這不是一個好主意。如何解析可包含轉義雙引號的雙引號分隔字符串
有沒有更好的方式在Java中做到這一點?
類似的東西應該做的伎倆,假設你要刪除的外部雙引號時適用(如果你不這樣做,它只是一個改變第一捕獲組的事項還包括引號):
public class Demo {
private static final Pattern WORD =
Pattern.compile("\"((?:[^\\\\\"]|\\\\.)*)\"|([^\\s\"]+)");
public static void main(String[] args) {
String cmd =
"command " +
"\"string with blanks\" " +
"\"anotherStringBetweenQuotes\" " +
"\"a string with \\\"escaped\\\" quotes\" " +
"stringWithoutBlanks";
Matcher matcher = WORD.matcher(cmd);
while (matcher.find()) {
String capturedGroup = matcher.group(1) != null ? matcher.group(1) : matcher.group(2);
System.out.println("Matched: " + capturedGroup);
}
}
}
輸出:
Matched: command
Matched: string with blanks
Matched: anotherStringBetweenQuotes
Matched: a string with \"escaped\" quotes
Matched: stringWithoutBlanks
正則表達式是有點複雜,所以它還有一個值得位的解釋:
[^\\\\\"]
匹配的一切,但反斜線引號或雙引號\\\\.
反斜槓後跟任何字符(包括雙引號),即轉義字符(?:[^\\\\\"]|\\\\.)*
匹配的逃脫或非轉義字符的任何序列匹配,但沒有捕獲的組(因爲(?:)
)"\"((?:[^\\\\\"]|\\\\.)*)\"
匹配裹入雙引號任何這樣的序列和捕獲引號內([^\\s\"]+)
匹配的非空白字符的任何非空序列,並捕獲它的一組中感謝和抱歉打擾你,但是這種方法優於'str.split(「(?<!\\\\)\」)的優點是什麼? '' – user1902247
你不打擾我,我在這裏回答問題,好處是正則表達式對我來說更加清晰了,如果你想分割,你的正則表達式必須描述分隔符,而我的正則表達式描述了你這也意味着我的正則表達式可以對輸入進行一些檢查,最後,我的方法可以延遲地匹配字符串,而不是爲整個匹配分配一個數組,這將使得一點點不同在大多數情況下,但如果字符串非常大,它可能是一件好事 – Dici
爲什麼downvote?請證明 – Dici
這不是一個免費的寫作服務。試一試。如果你無法使用它,請發佈你已經完成的和發生了什麼問題,我們會盡力幫助你。 –
老實說,只是在空白處做一個拆分,然後分別解析命令參數。你不必亂用正則表達式 – Dici
@Dici我不能分割空白,因爲參數可以包含空格 – user1902247