java - Java正则表达式无法正确解析URL

标签 java regex

我有一个文本文件,其中包含复杂程度不等的 URL。这是一个示例:

https://www.google.com/?gws_rd=ssl
http://www.cs.jhu.edu/news-events/news-articles/
maps.google.com
http://www.cnn.com/WORLD/?hpt=sitenav
http://www.cnn.com/JUSTICE/?hpt=sitenav
http://www.cs.jhu.edu/course-info/
http://e-catalog.jhu.edu/departments-program-requirements-and-courses/engineering/computer-science/
http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html
http://mexico.cnn.com/?hpt=ed_Mexico
cnn.com

从这些行中,我只想得到“X.Y”部分。换句话说,从前 4 行,我想得到:

google.com
jhu.edu
google.com
cnn.com

为了做到这一点,我创建了一个正则表达式并尝试匹配它:

public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("C:\\Users\\Me\\Desktop\\homework4file.txt"));
        String line = null;
        Pattern pattern = Pattern.compile("^[a-zA-Z0-9\\-\\.]+\\.(com)$");
        Matcher matcher;
        while((line = reader.readLine()) != null) {
            matcher = pattern.matcher(line);
            while(matcher.find()) {
                System.out.println(matcher.group(1));
            }
        }
    }

我的正则表达式只是为每一行返回“com”。我不明白我写的有什么问题。有人可以解释一下我的表达中的逻辑错误吗?

最佳答案

你不需要放置 anchor 。 ^ 断言我们位于开始处,但 .com 之前的部分并不位于开始处。 [a-zA-Z0-9\\-\\.]+ 会贪婪地匹配 .com 之前的部分,直到到达 / 。在此 http://mexico.cnn.com/?hpt=ed_Mexico 字符串中,正则表达式 [a-zA-Z0-9\\-\\.]+\\.( com) 将匹配 mexico.cnn.com 而不是 cnn.com。也可以通过输入 com, edu 进入由 | 分隔的非捕获组也会匹配 .edu 之前的字符串。

[^.\\n]+\\.(?:com|edu)

DEMO

String input = "https://www.google.com/?gws_rd=ssl\n" +
"http://www.cs.jhu.edu/news-events/news-articles/\n" +
"maps.google.com\n" +
"http://www.cnn.com/WORLD/?hpt=sitenav\n" +
"http://www.cnn.com/JUSTICE/?hpt=sitenav\n" +
"http://www.cs.jhu.edu/course-info/\n" +
"http://e-catalog.jhu.edu/departments-program-requirements-and-courses/engineering/computer-science/\n" +
"http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html\n" +
"http://mexico.cnn.com/?hpt=ed_Mexico\n" +
"cnn.com";
Pattern regex = Pattern.compile("[^.\\n]+\\.(?:com|edu)");
Matcher matcher = regex.matcher(input);
while(matcher.find()){
            System.out.println(matcher.group(0));
   }

输出:

google.com
jhu.edu
google.com
cnn.com
cnn.com
jhu.edu
jhu.edu
oracle.com
cnn.com
cnn.com

关于java - Java正则表达式无法正确解析URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26726393/

相关文章:

javascript - 匹配字符但不包括该字符和之后的所有内容

Javascript html.replace(regEx, "$0.01") 不起作用

c# - 如何修复我的正则表达式 ^\d+[-\d]?\d* 以匹配 123-45 而不是 123-?

java - 如何重复 Java 中的公共(public)类(class)?

Java,单个数据库列多次引用

java - 在 Java 中使用 DateTimeFormatter 解析 ZonedDateTime.now()

c# - 使用 C# 中的 Replace some groups with Regex 将程序集转换为 C

java - 将在程序中返回

java - 获取 Facebook 好友个人资料详细信息

Python正则表达式替换