Java:HTML中的空格无法使用正则表达式模式识别

时间:2013-01-14 15:24:43

标签: java html regex parsing

代码:

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这样的库有同样的问题。

2 个答案:

答案 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.010.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()并在需要时将开始和结束行标记^$用于正则表达式。