java 为遵循特定格式的URL创建过滤器

piok6c0g  于 2023-09-29  发布在  Java
关注(0)|答案(2)|浏览(92)

我有一个这样的URL:

http://aa-bb.cc-dd-ee.w.x.y.z:8080/funservice/graphql

我只想过滤w.x.y.z严格为以下值的请求:

fun.foo.bar.net

我正在尝试这样做,但我不太确定如何创建正则表达式。

private static final Pattern pat = Pattern.compile("http(.*?).fun.foo.bar.net(.*?)");

Matcher matcher = pat.matcher(httpRequest.getRequestURL().toString());
while (matcher.find()) {
     for (int j = 0; j <= matcher.groupCount(); j++) {
          String temp = matcher.group(j);
       }
}
iibxawm4

iibxawm41#

对于您的示例字符串,您可以用途:

^https?://\S*\.fun\.foo\.bar\.net(?::\d+)?(?:[/?#]\S*)?$

模式匹配:

  • ^字符串开头
  • https?://将协议与可选的s匹配
  • \S*匹配可选的非空格字符
  • \.fun\.foo\.bar\.net匹配感兴趣的部分(转义圆点以按字面意思匹配)
  • (?::\d+)?可选匹配端口
  • (?:[/?#]\S*)?可选匹配/?#之一,后跟可选的非空格字符
  • $字符串结束

Regex demo
在Java中使用双反斜杠:

String regex = "^https?://\\S*\\.fun\\.foo\\.bar\\.net(?::\\d+)?(?:[/?#]\\S*)?$";
gopyfrb3

gopyfrb32#

  • "...我只想过滤w.x.y.z严格为 * 的请求:
fun.foo.bar.net

……”
您可以使用 Matcher#matches 调用来简化代码,该调用可以通过 String#matches 访问。

  • "...我正在尝试这样做,但我不太确定如何创建正则表达式。..."*

您可以使用以下模式来匹配整个文本。
对于 match 调用,开始^和结束$是可选的。

^http://(?:[^.]+\.){2}fun\.foo\.bar\.net(?::.+|/.*)$

作为一个说明,我假设您希望 ”fun.foo.bar.net“ 跟随两个 domain-labels“aa-bb.cc-dd-ee."
如果不是这种情况,请将{2}更改为*

^http://(?:[^.]+\.)*fun\.foo\.bar\.net(?::.+|/.*)$

这里有一个例子。

String s = httpRequest.getRequestURL().toString();
String r = "http://(?:[^.]+\.){2}fun\.foo\.bar\.net(?::.+|/.*)";
boolean match = s.matches(r);

相关问题