我正在尝试解析(Java)自定义 GET 样式请求,我想通过正则表达式来做到这一点。
请求的格式如下:
GET myCommand?parameter1=value¶meter2=value¶meter3=value¶meter4=value
参数的数量是可变的,但至少需要一个参数。
有人可以帮我解决这个正则表达式吗?
以下是如何使用 4 行将其全部解析为 java 变量:
String command = input.replaceAll("(^\\w+ )|(\\?.*)", "");
Map<String, String> params = new LinkedHashMap<String, String>();
for (String pair : input.replaceFirst(".*?\\?", "").split("&"))
params.put(pair.split("=")[0], pair.split("=")[1]);
请注意,使用 aLinkedHashMap
以输入顺序进行迭代。
这是使用您的输入进行的一个小测试(稍作修改以具有不同的值):
public static void main(String[] args) throws Exception {
String input = "GET myCommand?parameter1=value1¶meter2=value2¶meter3=value2¶meter4=value4";
String command = input.replaceAll("(^\\w+ )|(\\?.*)", "");
Map<String, String> params = new LinkedHashMap<String, String>();
for (String pair : input.replaceFirst(".*?\\?", "").split("&"))
params.put(pair.split("=")[0], pair.split("=")[1]);
System.out.println("Command=" + command);
System.out.println("Params=" + params);
}
输出:
Command=myCommand
Params={parameter1=value1, parameter2=value2, parameter3=value2, parameter4=value4}
GET myCommand\?([a-z0-9]+)=(.+)(&([a-z0-9]+)=(.+))*
现在只需[a-z0-9]+
用正则表达式替换有效标识符,.+
用正则表达式替换有效值,并根据您选择的语言的要求进行转义,您应该一切顺利。
以下是适用于任何带有查询参数的请求 URL 的正则表达式:.+?(\?((\w+?=.+?)&)*\w+?=.+)?$
这.+?
是查询参数之前的匹配字符串。让我们打破正则表达式:(\?((\w+?=.+?)&)*\w+?=.+)?
((\w+?=.+?)&)*
表示零个或多个键值对 join with&
\w+?=.+
表示最后一个键值对
希望这可以帮助。如果您需要更多帮助,请告诉我。