2017-03-02 17 views
-1

我有一个大字符串,我想从该字符串中取得链接。我可以打印链接。从replace取代变量全部

Pattern pattern = Pattern.compile(".*(?<=overlay-link\" href=\").*?(?=\">).*"); 

与该代码。输出示例:

<a title="TITLE" class="overlay-link" href="LINK HERE"></a> 

当我尝试string.replaceAll,正则表达式删除链接并打印另一个变量。

EX: <a title="TITLE" class="overlay-link" href=""></a> 

我是新的正则表达式。你可以帮我吗?

这里是全码:

String content;  
Pattern pattern = Pattern.compile(".*(?<=overlay-link\" href=\").*?(?=\">).*"); 

try { 
    Scanner scanner = new Scanner(new File("sourceCode.txt")); 
    while (scanner.hasNext()) { 
     content = scanner.nextLine(); 
     if (pattern.matcher(content).matches()) {  
      System.out.println(content.replaceAll("(?<=overlay-link\" href=\").*?(?=\">)", "")); 
     } 
    } 
} catch (IOException ex) { 
    Logger.getLogger(SourceCodeExample.class.getName()).log(Level.SEVERE, null, ex); 
} 
+1

不要使用正则表达式解析XML或HTML。请参阅http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and-html-with-a-reg – VGR

+0

但我必须使用正则表达式 –

回答

0

如果我理解你的问题正确,您正在考虑退出只是在href标记指定的链接。

要做到这一点,你应该在你的正则表达式本身中使用捕获组,而不是尝试replaceAll。

replaceAll方法正确地找到链接并用空字符串替换它,并根据docs返回完整的结果字符串,这不是所需的结果。

你应该使用的正则表达式是这样的:.*(?<=overlay-link\" href=\")(.*?)(?=\">).*注意链接周围的捕获组()。

这将允许您找到匹配并访问捕获组1.我发现了一个很好的示例,说明如何在其他question中执行此操作。 (重要片段粘贴以下),由我添加

String line = "This order was placed for QT3000! OK?"; //<a> tag string 
Pattern pattern = Pattern.compile("(.*?)(\\d+)(.*)"); //insert regex provided above 
Matcher matcher = pattern.matcher(line); 
while (matcher.find()) { 
    System.out.println("group 1: " + matcher.group(1)); //This will be your link 
    System.out.println("group 2: " + matcher.group(2)); 
    System.out.println("group 3: " + matcher.group(3)); 
} 

评论

注:指数0表示整个Pattern