2010-10-29 111 views
0

我有一个java字符串处理一些文本和HTML:Java的字符串操作HTML标签

<title>test title</title> 
blabla bla more text 

我所试图实现的是两个方面:

1)获取的<title></title>内容并保存它在一个单独的字符串中。

2)删除原始字符串的一部分:<title>test title</title>

所以,最终的结果会是这样的

originalString:

<title>test title</title> 
blabla bla more text 

newString:

blabla bla more text 

PAGETITLE :test title

我该如何做到这一点?常用表达? 我无法真正把握它...

+1

这与此有关吗? http://stackoverflow.com/questions/240546/removing-html-from-a-java-string – 2010-10-29 22:17:20

回答

1

Don't use regular expressions to parse HTML!尝试使用JTidyany of these适用于Java的开源HTML解析器,它符合您的要求。

使用这些库将让你的生活更容易,因为它们被设计来解析HTML。你可以抓取你想要的节点并从中提取文本。

+0

你不觉得你有点苛刻吗? – tchrist 2010-10-30 04:18:21

+0

@tchrist我如何苛刻? – 2010-10-30 15:57:05

+0

因为你不知道海报的具体情况,所以你很苛刻。有限的情况下,模式*可以*用于匹配HTML以达到良好效果。标准的SO教条尽管内容丰富,但可能不够矫枉过正。如果你知道你的输入集合,那不是太难。如果你不这样做,那就是了。看到我的其他更长的评论。 – tchrist 2010-10-30 16:12:41

1

这是你将如何使用正则表达式来提取标题标签之间的文本:

String s = "<title>test title</title>"; 
    Pattern p = Pattern.compile("<title>(.*?)</title>"); 
    Matcher m = p.matcher(s); 
    while(m.find()){ 
     System.out.println(m.group(1)); 
    } 
+0

这是绅士的方式! – m88 2010-10-29 23:46:50

+2

答案中的错误:(1)HTML不区分大小写; (2)点不符合行结束符; (3)你忘记考虑标准属性; (4)你不应该在评论或脚本标签内匹配; (5)最小匹配不保证它不会在格式不正确的输入中包含重复的打开标记(6),您不应该在引用的属性中匹配。有可能会有更多的错误,但那些只是我的头顶。不过,这可能会解决他的问题。那么,这告诉你什么? – tchrist 2010-10-30 04:26:45

0

It is inadvisable to parse XML/HTML with regular expressions.但是,如果你绝对必须做这个事情你问我,试试这个:

package org.apache.people.mclark.examples.regex; 
import java.util.regex.*; 
public class Regex1 { 
    public static void main(String[] args) { 
     final String subjectString = "<title>test title</title>\n" + 
      "blabla bla more text"; 
     Pattern regex = Pattern.compile("<title>(.*?)</title>(.*)", 
       Pattern.DOTALL); 
     Matcher regexMatcher = regex.matcher(subjectString); 
     if (regexMatcher.find()) { 
      String pageTitle = regexMatcher.group(1); 
      String leftOvers = regexMatcher.group(2); 
      System.out.println("pageTitle[" + pageTitle + "]"); 
      System.out.println("leftOvers[" + leftOvers + "]"); 
     } else { 
      System.out.println("no match"); 
     } 
    } 
} 

我洗手我的任何不端行为!

+0

你不是不可能的;你的意思是很难在一般情况下得到正确的答案。 (或者你只是在谈论教科书的正则表达式,而不是现代的模式。)如果我们正在讨论一个带有已知有限输入集的操纵演示,那么这可能会比不可能更容易。也许他有其中之一。也许他没有。 – tchrist 2010-10-30 04:57:29

+0

tchrist,正则表达式不是递归的,所以它不能匹配嵌套的平衡标签。有一些正则表达式最近添加了递归结构,但它们很难使用。也许“不可能”是一个强词,许多事情是可能的(但不是可取的)与正则表达式。事实上,我只是从正则表达式标记的wiki @ http://stackoverflow.com/tags/regex/info中引用标准SO教条。一些问题的难度水平太高,以致新手无法正确实施。 – 2010-10-30 06:09:18

+0

现代模式肯定*是[递归](http://stackoverflow.com/questions/4031112/regular-expression-matching/4034386#4034386)。但是将它们用于[匹配HTML](http://stackoverflow.com/questions/4044946/regex-to-split-html-tags/4045840#4045840)在一般情况下非常容易出错并且很难值得努力。只有完全限制已知特征的输入集才能很容易地工作,尽管在这些情况下它通常可以做得很好。摩擦的输入很少像人们相信的那样有限。 – tchrist 2010-10-30 16:07:43