2012-08-08 71 views
0

我想第一次在Java中使用正则表达式。 我想获得一些字符串的一部分。该字符串是一个有点复杂:java正则表达式得到字符串的某些部分

<description> 
    &lt;a href='http://testlink.html' alt='some text'&gt;&lt;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' /&gt;&lt;/a&gt;&lt;br /&gt;some text; some text 
</description> 

我需要的是拿到位于字符串HREFALT。为此我正在做这样的代码:

for(Element element : elements) 
{ 
    //Elements children = element.children(); 
Pattern pattern = Pattern.compile("a\\bhref=*(.html|.htm)>"); 
String[] data = pattern.split(element.text()); ... 
} 

等等。目前,我只想取得成功,但只能获得href。回报总是整个字符串。不正确?我已经把html扩展保证,并没有发生。

+4

如果你打算解析html,为什么不使用[现有的html解析器](http://htmlparser.sourceforge.net/)? – Thomas 2012-08-08 20:36:56

回答

1
public static void main(String[] args){ 
    String sourcestring = "<description>&lt;a href='http://testlink.html' alt='some text'&gt;&lt;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' /&gt;&lt;/a&gt;&lt;br /&gt;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++; 
    } 
    } 
+0

这不是我正在努力,但是我认为这看起来不错。 – Matt 2012-08-08 20:51:55

+0

你在找什么,更准确些? – 2012-08-08 20:53:06

+0

我?我只是评论 - 不是我的问题;-)我只是解决了href抢劫的问题,而不是抢劫。 – Matt 2012-08-08 20:56:17

1

你的正则表达式不会找到对你有用的东西,甚至可能被打破。

下面的正则表达式为真:

* matches 0 or more of the preceding character 

. is any character 

所以你当前的正则表达式是试图找到匹配的模式,其中有一个A,一个单词边界,串HREF,0以上的字符串=字符,然后是任何字符,后跟html或任何字符,然后是htm,然后是>字符。如果你想使用这些特殊字符,你需要将它们转义出来

形成正则表达式的更好方法就像上面的Alogomorph的例子。

请看看正则表达式的Java文档的详细信息,哪些是允许:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

也有很多在网路上提供的教程和例子。

+0

我试图避免循环。就像我说的,这是我第一次尝试使用正则表达式。感谢您的精确观察。 – learner 2012-08-09 00:53:41

1

不要对此任务使用正则表达式,除非你知道绝对知道文本格式不会改变。你似乎想用正则表达式解析(X | HT)ML,那就是a bad thing。我建议解析为XML并使用XPath。

+0

塔索斯,我不知道这件事。我会尝试这种方法。感谢您的回复。 Definetely我会尝试。 – learner 2012-08-09 00:09:29

相关问题