Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式从HTML标记抓取文本_Java_Regex - Fatal编程技术网

Java 使用正则表达式从HTML标记抓取文本

Java 使用正则表达式从HTML标记抓取文本,java,regex,Java,Regex,我试图从HTML标记中读取一些内容,但对于正则表达式,我完全是个傻瓜(我已经想到了一些模式,但似乎没有一种模式起作用) 我在看一个网页,看这行: 我需要从那里提取“demilit”,你可以看到,有3个这样做的机会 哪一个位置是提取它的最佳位置?我将如何实现 我也用它来查找名称,因为我需要提取大约60个不同的名称,它们都使用相同的格式,只是名称只能包含字母、数字和下划线 public void parse(String list) { try { URL url = new

我试图从HTML标记中读取一些内容,但对于正则表达式,我完全是个傻瓜(我已经想到了一些模式,但似乎没有一种模式起作用)

我在看一个网页,看这行:

我需要从那里提取“demilit”,你可以看到,有3个这样做的机会

哪一个位置是提取它的最佳位置?我将如何实现

我也用它来查找名称,因为我需要提取大约60个不同的名称,它们都使用相同的格式,只是名称只能包含字母、数字和下划线

public void parse(String list) {
    try {
        URL url = new URL(list);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
        String line;
        StringBuilder stringBuilder = new StringBuilder();
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line).append("\n");
        }
        System.out.println(stringBuilder.toString());
        Matcher matcher = namePattern.matcher(stringBuilder.toString());
        if (matcher.find()) {
            System.out.println("matched: " + matcher.group());
        }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
(\w+
将抓取
之间的文本并将其放入第一组;但正如其他人所说,regex可能不是这里的最佳选择


编辑:将第一个+更改为*因为0个字符有效。还删除了第二个?根据下面的评论。

这里有一种方法,可以获取rel='XXX'属性中的文本

String val = "<td title='Visit Page for Demilict'><a href='personal.php?name=Demilict&amp;c=s' class='idk' rel='Demilict' style='color: teal;'>Demilict</a></td>";
String newVal = val.replaceFirst("^.*rel='([a-zA-Z0-9_]+)'.*$", "$1");
System.out.println("Result: " + newVal);
String val=”“;
字符串newVal=val.replaceFirst(“^.*rel=”([a-zA-Z0-9!]+)”.$”,“$1”);
System.out.println(“结果:+newVal”);

基本上,它只是寻找rel='XXX',并扔掉除XXX以外的所有东西。它允许rel包含字符a-z和a-z、0-9和下划线。

如果确实要使用正则表达式提取名称,此regexp应将名称存储在组1中:

<td[^>]*?><a[^>]*?>(\\w+)</a></td>
]*?>]*?>(\\w+)

为什么不改用DOM?不要使用正则表达式解析HTML-使用解析器(请参阅:)如果没有实际的模式,我们无法真正帮助您。您能告诉我们如何创建
namePattern
?此外,考虑使用API进行HTML/XML处理(如果是XTHML,XML将这样做)。使用正则表达式进行此类提取非常容易出错。任何不可预见的情况都可能产生问题。我如何判断它是否是XTHML?我使用
namePattern
作为
私有模式namePattern=Pattern.compile(“\\?obj=([A-Za-z0-9\]*)”)
正如旁注一样\w regex特殊字符与a-Za-z0-9_相同,非常简单,但可能更简单:您不需要第二个问号,因为左尖括号不是单词字符。非常感谢。还意识到*应该替换第一个+字符,因为0个额外字符也是有效的(尽管在这种情况下不适用)。