2012-06-25 72 views
1

我有以下一段从CSV文件中读取字符串的Java代码。然后,为了进行检查,并提取来自该图案中的“anyaddress”部分分割字符串:“http://www.anyaddress.anything/Java中的多种模式

//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.anything/”或“https://anyaddress.anything/

我需要提取已经在搜索以前的职位can we check multiple patterns using regex in java? only.I,发现我只需要添加“anyaddress”部分“|”。

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

我的节目中提取的地址为::但是,例如,当我编辑我正则表达式为通过将包括所述第二图案www.anyaddress.anything,而我只需要“anyaddress.anything /”仅部分,除此之外,程序正确提取没有“www”的地址。之前无法提取。

有人可以澄清我的错误在哪里?并举例说明如何包含多个模式,以使我的程序能够正确提取4种格式的链接?

+0

请注意,您的CSV解析失败了一堆有效的CSV文件。例如。 ''a,b,c'行不会被正确解析。 – Joey

+0

@Joey:我觉得对我来说应该没问题。 CSV只包含用逗号分隔的网址,所以我相信永远不会有包含逗号的网址。 –

+0

祝你好运相信:) – Joey

回答

2

我会避免回望,因为它很少使用,这里没有必要。另外,我不知道它是如何与变化相结合的。由于您在解析URL,我建议使用URL或URI类,提取域名,然后删除任何前导'www'。如果你仍然想使用正则表达式,尝试

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

读取

HTTP,加上可选的“斜线斜线结肠一个可选的“www。” (但不包括)下一个斜杠的捕获组

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

+0

+1。 Lookbehind不应该是你的第一个度假胜地。消耗一切并通过捕获组拉出有趣的位通常容易得多。 –

+0

+1。它也是纯粹的贪婪,这使得它在实践中可预测。 (它不处理HTTP URL规范中的每一个邪恶的情况,但是它们只会使代码变得糟糕,几乎为零增益。) –