java正则表达式解析部分标题标记

时间:2013-10-05 12:41:03

标签: java regex

好的,快速提问。我是Java的新手,我有一个作业,我必须从页面的标题标签中获取一个人的名字。我知道我的正则表达式,但我不能(或不知道如何)逃避一些角色。

示例

<title>Mr. Somebody | Department in which he's in</title>

所以,基本上我需要一个能让我成为“Mr. Somebody”的正则表达式。我试过了:

Pattern pat = Pattern.compile("<title>(.+?)|");                               
Matcher mat = pat.matcher(data);
boolean found = false;
while (!found && mat.find()) {
      name = mat.group(0);
      found = true;
}
System.out.println("Found a name : " + name);

我的问题是,无论我尝试过什么,我能得到的最多的是第一个角色。你认为使用indexOf和substrings的更简单的方法会更好,还是regexp仍然可行?

我知道通常regexp不适合解析html标签,但我正在考虑将此搜索更多地用于字符串搜索,因为我对整个标记(或其他可能包含的标记)不感兴趣。

非常感谢任何形式的帮助:)

5 个答案:

答案 0 :(得分:1)

你需要转义管道,因为它是一个在正则表达式中具有特殊含义的字符。尝试:

<title>(.+?)\\|

|表示“或”,表示正则表达式会尝试与<title>(.+?)或任何内容匹配(|之后没有任何内容。

当它尝试与<title>(.+?)匹配时,它只会获得第一个字符,因为.+?是懒惰的(它尽可能少地匹配)。

或者,您可以使用否定的类:

<title>([^\\|]+)

[^\\|]+将匹配管道以外的任何字符。

答案 1 :(得分:0)

应该有效

Pattern pat = Pattern.compile("<title>(.*?)\\|");   

并使用

mat.group(1) instead of mat.group(o); 

答案 2 :(得分:0)

这是一种方法,如果你愿意,可以避免使用Pattern和Matcher:

String name = "<title>Mr. Somebody | Department in which he's in</title>";
name = name.substring(7).replaceAll("\\|.*", "");

substring(7)将删除第一个标记,然后replaceAll将从管道字符开始删除所有内容(替换为空字符串)。

答案 3 :(得分:0)

也许这就是你想要的:

(?<=<title>)(.+?(?=[|].+?))(?=.+?</title>)

归还某人先生。例如,您可以对其进行测试here

答案 4 :(得分:0)

这是一种方式:

<\s*title[^>]*>\s*([^\|]+)
  • 带走领先的白色空间。
  • 处理某人可能添加到标题标签的任何可能奇怪的属性,即<title data-cookies="I hide cookies here :P">I like titles</title>
  • 处理标题前添加的任何空格,即< title >仍然有效。