Java - 正则表达式相互匹配
Java - Regular Expressions matching one to another
我正在尝试使用 RE 检索数据位。问题是我对 RE 不是很流利。考虑代码。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class HTTP{
private static String getServer(httpresp){
Pattern p = Pattern.compile("(\bServer)(.*[Server:-\r\n]"); //What RE syntax do I use here?
Matcher m = p.matcher(httpresp);
if (m.find()){
return m.group(2);
public static void main(String[] args){
String testdata = "HTTP/1.1 302 Found\r\nServer: Apache\r\n\r\n"; //Test data
System.out.println(getServer(testdata));
如何让 "Server:" 到下一个输出 "Apache" 的“\r\n”?我用谷歌搜索并尝试了自己,但都失败了。
您可以使用捕获组或正面回顾。
Pattern.compile("(?:\bServer:\s*)(.*?)(?=[\r\n]+)");
然后打印组索引1。
示例:
String testdata = "HTTP/1.1 302 Found\r\nServer: Apache\r\n\r\n";
Matcher matcher = Pattern.compile("(?:\bServer:\s*)(.*?)(?=[\r\n]+)").matcher(testdata);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
或
Matcher matcher = Pattern.compile("(?:\bServer\b\S*\s+)(.*?)(?=[\r\n]+)").matcher(testdata);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
输出:
Apache
解释:
(?:\bServer:\s*)
在正则表达式中,非捕获组将表示为 (?:...)
,它只会进行匹配。 \b
称为单词边界,匹配单词字符和非单词字符。 Server:
匹配字符串 Server:
并且后面的零个或多个空格将被 \s*
匹配
(.*?)
在正则表达式中 (..)
称为捕获组,它捕获那些与捕获组中存在的模式匹配的字符。在我们的例子中 (.*?)
将非贪婪地捕获所有字符,直到
(?=[\r\n]+)
检测到一个或多个换行符。 (?=...)
称为正向先行,它断言匹配后必须跟有与先行内部存在的模式匹配的字符。
这是一条单线:
private static String getServer(httpresp) {
return httpresp.replaceAll(".*Server: (.*?)\r\n.*", "");
}
这里的技巧分为两部分:
- 使用
.*?
,这是一个勉强匹配(消耗尽可能少,仍然匹配)
- 正则表达式匹配整个输入,但使用反向引用捕获并返回所需的目标
我正在尝试使用 RE 检索数据位。问题是我对 RE 不是很流利。考虑代码。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class HTTP{
private static String getServer(httpresp){
Pattern p = Pattern.compile("(\bServer)(.*[Server:-\r\n]"); //What RE syntax do I use here?
Matcher m = p.matcher(httpresp);
if (m.find()){
return m.group(2);
public static void main(String[] args){
String testdata = "HTTP/1.1 302 Found\r\nServer: Apache\r\n\r\n"; //Test data
System.out.println(getServer(testdata));
如何让 "Server:" 到下一个输出 "Apache" 的“\r\n”?我用谷歌搜索并尝试了自己,但都失败了。
您可以使用捕获组或正面回顾。
Pattern.compile("(?:\bServer:\s*)(.*?)(?=[\r\n]+)");
然后打印组索引1。
示例:
String testdata = "HTTP/1.1 302 Found\r\nServer: Apache\r\n\r\n";
Matcher matcher = Pattern.compile("(?:\bServer:\s*)(.*?)(?=[\r\n]+)").matcher(testdata);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
或
Matcher matcher = Pattern.compile("(?:\bServer\b\S*\s+)(.*?)(?=[\r\n]+)").matcher(testdata);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
输出:
Apache
解释:
(?:\bServer:\s*)
在正则表达式中,非捕获组将表示为(?:...)
,它只会进行匹配。\b
称为单词边界,匹配单词字符和非单词字符。Server:
匹配字符串Server:
并且后面的零个或多个空格将被\s*
匹配
(.*?)
在正则表达式中(..)
称为捕获组,它捕获那些与捕获组中存在的模式匹配的字符。在我们的例子中(.*?)
将非贪婪地捕获所有字符,直到(?=[\r\n]+)
检测到一个或多个换行符。(?=...)
称为正向先行,它断言匹配后必须跟有与先行内部存在的模式匹配的字符。
这是一条单线:
private static String getServer(httpresp) {
return httpresp.replaceAll(".*Server: (.*?)\r\n.*", "");
}
这里的技巧分为两部分:
- 使用
.*?
,这是一个勉强匹配(消耗尽可能少,仍然匹配) - 正则表达式匹配整个输入,但使用反向引用捕获并返回所需的目标