代码:
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”。
但是如果我在模式匹配的代码中手动定义String s
值(“0.1”)。
此外,如果我在调试模式下复制char[] data
的内容并使用此复制内容定义s
,则该模式也不适合,尽管它看起来与上面手动定义的值相同。
是否有可能找出真正读取的空白字符?
似乎空白并不总是空格,因此与正则表达式类[\ s]不匹配。这可能吗?
修改
感谢您的回答。它实际上是一个空格字符(\ xA0),\ s正则表达式类无法识别。
对于所有那些贬低(真的令人沮丧)的人,我的问题只是让我误解了。也许这个问题确实是“我想用正则表达式解析HTML”这句话,但实际上我只是来自HTML表格单元格中包含未知空白字符的内容; - )。
我认为我和jsoup这样的库有同样的问题。
答案 0 :(得分:1)
在Java正则表达式中,为了匹配U+00A0
,传统上不会将非中断空格字符(NBSP,\s
)视为空格。如果这是导致您的问题的原因,您只需将其添加到现有的空白类:
"^[\\s\\xA0]*\\d+\\.\\d+[\\s\\xA0]*$"
还有其他Unicode空白字符与\s
不匹配,但它们都不像NBSP那样常见。
或者,如果您运行的是Java 7+,则可以指定UNICODE_CHARACTER_CLASS
mode并继续使用\s
。
答案 1 :(得分:0)
您的代码段太长了,但据我了解,您只需要匹配0.0
,10.52
等内容的模式,即浮点数?使用模式\\d+\\.\\d+
。
\d+
表示1位数
\.
表示点。正则表达式中的单个点.
表示“任何字符”
以下是用法示例:
String str = "123.456";
Pattern p = Pattern.compile("\\d+\\.\\d+");
Matcher m = p.matcher(str);
if (m.matches()) {
// do something.
}
顺便说一句,请注意matches()
匹配全行。如果您想匹配部分行使用find()
。我个人总是使用find()
并在需要时将开始和结束行标记^
和$
用于正则表达式。