我第一次尝试在Java中使用Regex。 我想得到一些字符串的一部分。字符串有点复杂:
<description>
<a href='http://testlink.html' alt='some text'><img border='0'
src='http://s2.glbimg.com/zzag70iNYX-QK24sUp0YXQmmXhx7yb8j2Sq2YK7tvX3A6vCwEUOFnFTBONQFT-
ni/s.glbimg.com/es/ge/f/original/2012/04/25/image.jpg'
alt='some' title='text' /></a><br />some text; some text
</description>
我的需求是获取 href 和 alt 中的字符串。为此,我正在执行此代码:
for(Element element : elements)
{
//Elements children = element.children();
Pattern pattern = Pattern.compile("a\\bhref=*(.html|.htm)>");
String[] data = pattern.split(element.text()); ...
}
等等。目前我只是试图获得 href 而没有成功。返回始终是整个字符串。不对吗?我把html扩展名保证,没有任何事情发生。
答案 0 :(得分:1)
public static void main(String[] args){
String sourcestring = "<description><a href='http://testlink.html' alt='some text'><img border='0' src='http://s2.glbimg.com/zzag70iNYX-QK24sUp0YXQmmXhx7yb8j2Sq2YK7tvX3A6vCwEUOFnFTBONQFT-
ni/s.glbimg.com/es/ge/f/original/2012/04/25/image.jpg'
alt='some' title='text' /></a><br />some text; some text</description>";
Pattern re = Pattern.compile("(?<=href='|alt=')[^']*|(?<=href=\"|alt=\")[^\"]*");
Matcher m = re.matcher(sourcestring);
int mIdx = 0;
while (m.find()){
for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
}
mIdx++;
}
}
答案 1 :(得分:1)
你的正则表达式不会找到对你有用的东西,甚至可能被破坏。
在正则表达式中如下:
* matches 0 or more of the preceding character
. is any character
所以你当前的正则表达式试图找到匹配模式的字符串,其中有a,a字边界,字符串href,0或更多=字符,然后是任何字符后跟html或任何字符后跟htm和然后a>字符。如果你想使用那些特殊字符,你需要逃避它们
形成正则表达式的更好方法就像Alogomorph上面的例子。
请查看正则表达式的Java文档,以获取有关允许内容的更多信息:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
网上还有很多其他教程和示例。
答案 2 :(得分:1)
请勿对此任务使用正则表达式,除非绝对知道文本格式不会更改。你似乎想用regexps解析(X | HT)ML,那就是a bad thing。我建议解析为XML并使用XPath。