如何使用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上使用正则表达式不是很好的风格,是吗?但对于这项任务,我认为它会起作用,不是吗?
答案 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。