好的,快速提问。我是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标签,但我正在考虑将此搜索更多地用于字符串搜索,因为我对整个标记(或其他可能包含的标记)不感兴趣。
非常感谢任何形式的帮助:)
答案 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)
答案 4 :(得分:0)
这是一种方式:
<\s*title[^>]*>\s*([^\|]+)
<title data-cookies="I hide cookies here :P">I like titles</title>
< title >
仍然有效。