1

我有以下一段从 CSV 文件中读取字符串的 Java 代码。然后,拆分字符串以检查它们并提取模式中出现的“anyaddress”部分:“ http://www.anyaddress.anything/

//Split the file strings since it is CSV file
    while((Line=in.readLine())!=null) 
       strings = Line.split(",");

    for(int i=0; i<strings.length; i++)
    {
        Pattern regex = Pattern.compile(
        "(?<=http://www.)" + "[^/]*", Pattern.COMMENTS);
        Matcher regexMatcher = regex.matcher(strings[i]); 
        if (regexMatcher.find()) 
        { 
           //Returns the input subsequence matched by the previous match.
           ResultString = regexMatcher.group();                
           out.write(ResultString);
           out.newLine();
        }  //end if

    } //end for loop

    in.close();
    out.close();

现在,我发现我的文本文件可能包含以下不同格式的字符串:' http://www.anyaddress.anything/ '或' http://anyaddress.anything/ '或' https://www.anyaddress。任何/ '或' https://anyaddress.anything/ '

我只需要提取“anyaddress”部分。我在以前的帖子中搜索过我们可以在java中使用正则表达式检查多个模式吗?发现我只需要加“|”。但例如,当我编辑我的正则表达式以通过添加包含第二个模式时:

Pattern regex = Pattern.compile(
        "(?<=http://www.) | (?<=http://)" + "[^/]*", Pattern.COMMENTS);

我的程序将地址提取为:www.anyaddress.anything,而我只需要“anyaddress.anything/”部分,此外程序正确提取了没有“www”的地址。以前无法提取。

谁能向我澄清我的错误在哪里?并举例说明如何包含多个模式以使我的程序正确提取上述 4 种格式中的任何一种格式的链接?

4

1 回答 1

2

我会避免回溯,因为它不经常使用并且在这里没有必要。另外,我不知道它如何与交替结合。由于您正在解析 URL,我建议您使用 URL 或 URI 类,提取域名,然后删除任何前导的“www”。如果您仍想使用正则表达式,请尝试

Pattern.compile("https?//:(?:www[.])?([^/]*)")

那读

http,加上一个可选的 's' 斜杠 斜杠冒号和可选的 'www.' 以及直到(但不包括)下一个斜线的所有内容的捕获组

您使用 group(1) 读取结果,因为它是第一个捕获组,而不是整个匹配。

于 2012-06-25T11:05:13.187 回答