关于html数据的java模式匹配器正则表达式

时间:2015-04-17 11:38:29

标签: java regex

如何使用java正则表达式模式匹配器来隔离文本Q170596,我试图在regexr.com上进行,但转义字符与java不对应。

这是我要解析的文字:

<!-- wikibase-toolbar --><span class="wikibase-toolbar-container"><span class="wikibase-toolbar-item wikibase-toolbar ">[<span class="wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit"><a href="/wiki/Special:SetSiteLink/Q170596">edit</a></span>]</span></span>

为了挖出Q170596,剩下的就可以扔掉了。

我猜它会是这样的:

//this is not right
Pattern p = Pattern.compile("<!-- wikibase-toolbar --><span class=\"wikibase-toolbar-container\"><span class=\"wikibase-toolbar-item wikibase-toolbar \">[<span class=\"wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit\"><a href=\"/wiki/Special:SetSiteLink/(.*?)\">edit<\/a><\/span>]<\/span><\/span>");

String line;
while ((line = br.readLine()) != null) 
{
    Matcher m = p.matcher(line);
    if( m.matches() ) 
    {
        String first_part    = m.group(1);
        String thing_i_want  = m.group(2);
        String more_crap = m.group(3);
    }
}

我曾经被告知在html上使用正则表达式不是很好的风格,是吗?但对于这项任务,我认为它会起作用,不是吗?

2 个答案:

答案 0 :(得分:2)

Pattern p = Pattern.compile("<!-- wikibase-toolbar --><span class=\"wikibase-toolbar-container\"><span class=\"wikibase-toolbar-item " +
            "wikibase-toolbar \">\\[<span class=\"wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit\"><a " +
            "href=\"/wiki/Special:SetSiteLink/(.*?)\">edit</a></span>\\]</span></span>");

这就是你想要的模式

逃避[和] \\ [和\\] 也不要逃避

</a> and </span>

标记。

并且您认为.group(1)在您想要的部分之前获取所有内容,.group(2)获取匹配区域,.group(3)获取该行的其余部分。这不是匹配器的工作方式。

每组()都是您可以检索的组。如果你使用1组(),那么.group(1)将检索这个匹配的组。

public class Test {
    public static void main(String[] argv) {
        Pattern p = Pattern.compile("<!-- wikibase-toolbar --><span class=\"wikibase-toolbar-container\"><span class=\"wikibase-toolbar-item " +
            "wikibase-toolbar \">\\[<span class=\"wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit\"><a " +
            "href=\"/wiki/Special:SetSiteLink/(.*?)\">edit</a></span>\\]</span></span>");
        String line = "<!-- wikibase-toolbar --><span class=\"wikibase-toolbar-container\"><span class=\"wikibase-toolbar-item wikibase-toolbar " +
            "\">[<span class=\"wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit\"><a href=\"/wiki/Special:SetSiteLink/Q170596\">edit</a></span>]</span></span>";

        Matcher m = p.matcher(line);
        if (m.matches()) {
            String first_part = m.group(1);
            System.out.println(first_part);
        }
    }
}

一些指示:我相信这种模式可以简单得多。尽量减少模式,例如只检查身体内容编辑。

答案 1 :(得分:1)

不需要这个巨大的正则表达式!这样做:

String line = "<!-- wikibase-toolbar --><span class=\"wikibase-toolbar-container\"><span class=\"wikibase-toolbar-item wikibase-toolbar \">[<span class=\"wikibase-toolbar-item wikibase-toolbar-button wikibase-toolbar-button-edit\"><a href=\"/wiki/Special:SetSiteLink/Q170596\">edit</a></span>]</span></span>";
Pattern p = Pattern.compile("(.*)<a[^=]*=\"[^\\/]*\\/([^\\/]+\\/)*(.*)\">.*");
Matcher m = p.matcher(line);
if (m.matches()) {
    System.out.println(m.group(3));
}

正则表达式DEMO