0

好的,快速提问。我是 Java 的新手,我有一个任务,我必须从页面的标题标签中获取一个人的名字。我知道我的正则表达式,但我不能(或不知道如何)转义某些字符。

例子

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

所以,基本上我需要一个可以让我成为“某人先生”的正则表达式。我试过了 :

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 和子字符串的更简单的方法会更好,还是正则表达式仍然可行?

我知道通常正则表达式不适合解析 html 标签,但我认为这个搜索更多的是字符串搜索,因为我对整个标签(或可能包含在其中的其他标签)不感兴趣。

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

4

5 回答 5

1

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

<title>(.+?)\\|

|表示“或”,这意味着正则表达式将尝试匹配其中一个<title>(.+?)或不匹配(在|.

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

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

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

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

于 2013-10-05T12:42:52.380 回答
0

它应该工作

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

并使用

mat.group(1) instead of mat.group(o); 
于 2013-10-05T12:47:50.533 回答
0

如果您愿意,这是一种避免使用 Pattern 和 Matcher 的方法:

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

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

于 2013-10-05T12:59:21.413 回答
0

也许这就是你想要的:

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

它返回某人先生。例如,您可以在这里测试它。

于 2013-10-05T13:17:11.533 回答
0

这是一种方法:

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