給定一個像這樣的字串輸入:Key=Value;key1=value1;key2=value2;key3=value3;并使用;作為分隔符,我們也可以在運行時使用\;值。;
Key=Value\;key1=value1\;key2=value2\;key3=value3;當我提取值時用戶輸入這樣的輸入時,問題就來了
期望鍵和值的映射。4 個鍵 (Key,Key1,Key2,Key3) 和 4 個值 (Value,Value1,Value2,Value3)
約束:
- 該值可以是任何字串。
- 該值可以包含另一個鍵。前任。鍵=值;鍵1=值=123;所以我們有 2 個鍵,第二個鍵的值可能包括第一個鍵。
- 鍵可以是任何字串。
- 可以是任意數量的鍵和值。
- 該值可以為空。
- 我們有一個鍵串列,但用戶可能不會添加所有鍵。
嘗試了更多的正則運算式,但仍然沒有完全正確。這是當前使用的正則運算式:
([\\n\\s]*(. ?)=(.*?;?);[\\n\\s]*)
但是你能幫助使用正則運算式或引入新演算法嗎
uj5u.com熱心網友回復:
據我了解,用戶負責轉義諸如;. 如果這是真的,要求他們也逃跑不是很合理\嗎?
所以\最后單獨使用會導致輸入字串無效,就像使用;而不轉義一樣。因此,如果用戶想要輸入\它應該以與以前相同的方式進行轉義\\。
uj5u.com熱心網友回復:
[編輯] 如果您允許轉義分隔符(\=在鍵中并\;在值中),那么您可以使用后向匹配來匹配真正的分隔符:
\b(. ?)(?<!\\)=(. ?)(?<!\\);
正則運算式101
uj5u.com熱心網友回復:
您的問題中有幾件事讓我感到困惑,我很遺憾您沒有提供任何代碼。例如,為什么在分號前需要一個反斜杠?
也就是說,你可以嘗試這樣的事情:
private static final Pattern RE
= Pattern.compile("\\s*([^=;] )=((?:[^;\\\\]|\\\\;|\\\\\\\\)*)\\s*;\\s*");
private static Map<String,String> toMap(String input) {
Map<String,String> map = new HashMap<>();
Matcher matcher = RE.matcher(input);
while (matcher.find()) {
map.put(matcher.group(1), matcher.group(2));
}
return map;
}
它適用于:
String input = "URL=https://postman-echo.com/post;Method=POST;Headers=Content-Type:application/json\\; charset=utf-8\\;;Body=fileName;Cookies Variable Name=;File Path=C:\\s.png;Response Variable Name=ResponseResult;Status Code Variable Name=StatusCode;Response Cookies Variable Name=ResponseCookies;";
Map<String,String> map = toMap(input);
結果:
Cookies Variable Name =
Headers = Content-Type:application/json\; charset=utf-8\;
Response Cookies Variable Name = ResponseCookies
Response Variable Name = ResponseResult
Method = POST
Status Code Variable Name = StatusCode
Body = fileName
URL = https://postman-echo.com/post
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523833.html
