2

代码:

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。该程序读取tdhtml 表中标签的内容。表格单元格中的内容应该符合Pattern p.

现在的主要问题是正则表达式模式与“0.1”这样的单元格内容不匹配。但是,如果我String s在代码中使用值(“0.1”)手动定义模式匹配。

此外,如果我char[] data在调试模式下复制 的内容并s使用此复制的内容进行定义,则该模式也不适合,尽管它看起来与上面手动定义的值相同。

是否可以找出真正读取了哪些空白字符?

似乎空格并不总是空格,因此与正则表达式类 [\s] 不匹配。这可能吗?

编辑:

感谢您的回答。它实际上是一个空白字符 (\xA0),\s 正则表达式类无法识别。

对于所有投反对票(真的令人沮丧)的人来说,我的问题只是误解了我。也许问题真的是“我想用正则表达式解析 HTML”这句话,但实际上我只是从 HTML 表格单元格中获得了带有未知空白字符的内容 ;-)。

我想我在使用像 jsoup 这样的库时遇到了同样的问题。

4

2 回答 2

2

在 Java 正则表达式中,不间断空格字符 (NBSP, U+00A0) 传统上不被视为空格以匹配\s. 如果这是导致您的问题的原因,您只需将其添加到现有的空白类中:

"^[\\s\\xA0]*\\d+\\.\\d+[\\s\\xA0]*$"

还有其他 Unicode 空白字符与 不匹配\s,但它们都不像 NBSP 那样常见。

Alternatively, if you're running Java 7+ you can specify UNICODE_CHARACTER_CLASS mode and go on using \s.

于 2013-01-14T17:03:28.973 回答
0

您的代码片段太长,但据我了解,您只需要模式来匹配诸如等之类的东西0.010.52即浮点数?使用模式\\d+\\.\\d+

\d+表示 1..n 位 \.表示点。正则表达式中的单个点.表示“任何字符”

这是使用示例:

String str = "123.456";
Pattern p = Pattern.compile("\\d+\\.\\d+");
Matcher m = p.matcher(str);
if (m.matches()) {
    // do something.
}

顺便说一句,注意matches()匹配整行。如果您想匹配部分行,请find()改为使用。我个人总是在需要时使用find()和使用开始和结束行标记^以及$正则表达式本身。

于 2013-01-14T15:35:05.397 回答