【发布时间】:2013-01-14 15:24:42
【问题描述】:
代码:
static short state = 0;
static int td_number = 0;
public static void main(String[] args) {
final Pattern p = Pattern.compile("^[\\s]*?\\d+\\.\\d+[\\s]*?");
final short TD_ENTRY = 0;
final short NO_ENTRY = 1;
HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback() {
public void handleText(char[] data, int pos) {
switch (state) {
case NO_ENTRY:
break;
case TD_ENTRY: {
// We are in the right table column
// Create string from char array
String s = new String(data);
Matcher m = p.matcher(s);
boolean b = m.matches();
// Check if data information has correct format (0.0)
if (b) {
}
}
break;
default:
break;
}
state = NO_ENTRY;
}
public void handleStartTag(HTML.Tag tag, MutableAttributeSet set, int pos) {
if (tag == HTML.Tag.TD) {
//[...]
}
}
};
Reader reader = new StringReader(html);
try {
new ParserDelegator().parse(reader, callback, false);
} catch (IOException e) {
}
}
我正在尝试使用正则表达式解析 HTML。该程序读取 html 表中td 标记的内容。表格单元格中的内容应符合Pattern p 中定义的特殊模式。
现在的主要问题是正则表达式模式与像“0.1”这样的单元格内容不匹配。
但是,如果我在代码中使用模式匹配的值(“0.1”)手动定义String s。
此外,如果我在调试模式下复制 char[] data 的内容并使用此复制的内容定义 s,则该模式也不适合,尽管它看起来与上面手动定义的值相同。
是否有可能找出真正读取了哪些空白字符?
似乎空格并不总是空格,因此与正则表达式类 [\s] 不匹配。这可能吗?
编辑:
感谢您的回答。它实际上是一个空白字符 (\xA0),\s 正则表达式类无法识别。
对于所有投反对票(真的很令人沮丧)的人来说,我的问题只是误解了我的意思。也许问题真的是“我想用正则表达式解析 HTML”这句话,但实际上我只是从 HTML 表格单元格中获得了带有未知空白字符的内容 ;-)。
我想我在使用像 jsoup 这样的库时也遇到了同样的问题。
【问题讨论】:
-
这是您的主要问题:Parsing Html The Cthulhu Way。使用 jsoup 之类的库,而不是 RegEx
-
你违反了编程的 10 条诫命之一。不要使用正则表达式来解析 HTML。阅读:codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html
-
@jlordo 是的,但是 trim() 函数不会出于任何原因删除空格。
-
"我正在尝试使用正则表达式解析 HTML。"每当您发现自己这么说时,请停止您正在做的事情并远离键盘。然后,学习如何使用 XML 解析器。那么——只那么——你应该继续吗。
-
HTML 通常包含与
\s或String.trim()使用的空间定义不匹配的不间断空格(代码点160)。\s仅与[ \t\n\x0B\f\r]匹配,trim仅将代码点