使用JAVA和正则表达式查找URL的一部分

时间:2019-10-06 23:58:52

标签: java regex

我的网址可以是

"http://example.com/bar1/checkstatus" or "http://example.com/bar2/checkstatus"

在JAVA中,example.com保持不变,然后紧跟bar1bar2的.matches()函数搜索此URL的最有效方法是什么。 URL的其余部分可能会有所不同。

2 个答案:

答案 0 :(得分:3)

最好的方法是不要那样做

相反,请使用URLURI类来解析URL,然后提取“路径”组件并进行进一步分析。 (您可以使用正则表达式在URL解析器处理转义之后搜索路径...。)

为什么对URL文本使用正则表达式搜索是一个坏主意?

因为:

  • URL的某些部分区分大小写,而其他部分则不区分大小写
  • URL的某些部分可能已编码
  • URL的某些部分可能是顺序敏感的

考虑到这些问题的正则表达式通常很复杂且难以阅读。而且,如果您忽略它们,则在显示各种不同情况的URL时,匹配可能会出现故障。

答案 1 :(得分:0)

我不确定最好的方法,但是我猜测您希望搜索/捕获checkstatus,为此我们将以一个简单的表达式开始:

(?i)^https?://(?:w{3}\.)?example\.com/bar[12]/([^/]*)/?$ 

假设会有可选的wwww.(?:w{3}\.)?),httphttpss?),并在结尾加上斜杠({{1} }),如果没有的话,我们可以从表达式中删除它们:

/?

测试

(?i)^http://example\.com/bar[12]/([^/]*)$ 

输出

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "(?i)^https?://(?:w{3}\\.)?example\\.com/bar[12]/([^/]*)/?$";
        final String string = "http://example.com/bar1/checkstatus\n"
             + "http://example.com/bar2/checkstatus\n"
             + "https://www.example.com/bar1/checkstatus\n"
             + "https://www.example.com/bar2/checkstatus\n"
             + "http://example.com/bar1/checkstatus/\n"
             + "http://example.com/bar2/checkstatus/\n"
             + "https://www.example.com/bar1/checkstatus/\n"
             + "https://www.example.com/bar2/checkstatus/";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }


    }
}

如果您希望简化/修改/探索表达式,请在regex101.com的右上角进行说明。如果愿意,您还可以在this link中查看它如何与某些示例输入匹配。


RegEx电路

jex.im可视化正则表达式:

enter image description here