gpt4 book ai didi

java - 检查各个捕获组

转载 作者:行者123 更新时间:2023-12-01 14:47:30 25 4
gpt4 key购买 nike

我有一个 HTTP 请求,我已为其构造了一个表达式。到目前为止,表达式有效,我可以将请求拆分为字符串数组,但我想看看是否可以通过匹配单独的捕获组来简化它。

所以:

private void process(final String message) {
Pattern pattern = Pattern.compile("(GET|get){1}\\s(/.*)\\s(HTTP|http)(/1\\.0)");
Matcher matcher = pattern.matcher(message);
}

请求是这样的:

GET / HTTP/1.0

非常简单。那么,有什么方法可以遍历每个捕获组来检查是否存在匹配项?假设请求使用 POST 而不是 GET,是否可以检查第一个捕获组,然后返回 501“未实现”响应?

我的第一个解决方案是简单地按空格分割消息,然后检查每个单独的数组元素。但这似乎有点“糟糕”。

编辑:

问题是,matches() 匹配整个事物,如果一组失败,整个表达式就会失败,这是我不想要的。任意数量的组应该可以失败/成功,而不会抛出 IllegalStateException。

最佳答案

即使某些组不匹配,也要保持匹配,它们需要是可选的。

然后使用 Matcher#find() 方法以及 Matcher#group(x) 访问组(从 1 开始,因为 0 表示整个匹配) )。

示例:

String msg = "GET HTTP 200 OK"; //resource and protocol version are left out by purpose

Pattern pattern = Pattern.compile("(GET|get)?\\s(/[^\\s]*)?\\s(HTTP|http)?(/1\\.0)?");
Matcher matcher = pattern.matcher( msg );

while ( matcher.find() )
{
System.out.println(matcher.group( 1 )); //prints GET
System.out.println(matcher.group( 2 )); //prints null since there's no resource
System.out.println(matcher.group( 3 )); //prints HTTP
System.out.println(matcher.group( 4 )); //prints null since there's no version string
}

作为旁注,我需要稍微调整一下你的表达式,因为第二组 (/.*) 会贪婪地匹配第一个斜杠之后的任何内容。不过,它还远未达到完美。



第二种方法可能是应用多个表达式/模式并将它们一个接一个地应用到匹配器。

示例:

Pattern methodPattern = Pattern.compile("GET|get");
Matcher matcher = methodPattern.matcher( msg );

if ( matcher.find() )
{
System.out.println("method: " + matcher.group());
}

if ( matcher.usePattern( Pattern.compile("\\s/([^\\s]*)") ).find() )
{
System.out.println("resource: " + matcher.group(1));
}

if ( matcher.usePattern( Pattern.compile("HTTP|http") ).find() )
{
System.out.println("protocol: " + matcher.group());
}

if ( matcher.usePattern( Pattern.compile("/(\\d\\.\\d)") ).find() )
{
System.out.println("version: " + matcher.group(1));
}

这利用了以下事实:匹配器的读取位置设置为匹配后的位置,并且对 find() 的任何后续调用都将从那里开始。如果模式不匹配,则位置保持不变。

因此,模式必须按顺序应用,但是可选的。

关于java - 检查各个捕获组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15272799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com