簡體   English   中英

正則表達式無法正確解析URL Java

[英]Regular expression not parsing URL properly Java

我有一個文本文件,其中包含范圍復雜的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

從這些行中,我只想獲取“ XY”部分。 換句話說,從前四行,我想得到:

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”。 我看不出我寫的東西有什么問題。 有人可以解釋我的表達中的邏輯錯誤嗎?

您無需放置錨點。 ^斷言我們才是開始,但是.com之前的部分並不是開始。 [a-zA-Z0-9\\\\-\\\\.]+會貪婪地匹配.com直到/之前的部分。 在此http://mexico.cnn.com/?hpt=ed_Mexico字符串中,正則表達式[a-zA-Z0-9\\\\-\\\\.]+\\\\.(com)mexico.cnn.com不匹配cnn.com 。而且還通過把comedu成界定的非捕獲組| 也將匹配.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM