【问题标题】:Java: Whitespace in HTML not recognized with Regex patternJava:正则表达式模式无法识别 HTML 中的空格
【发布时间】: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 仅将代码点

标签: java html regex parsing


【解决方案1】:

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

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

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

或者,如果您运行的是 Java 7+,您可以指定 UNICODE_CHARACTER_CLASS mode 并继续使用 \s。

【讨论】:

    【解决方案2】:

    您的代码 sn-p 太长,但据我了解,您只需要模式来匹配 0.0、10.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() 并在需要时将开始和结束行标记^ 和$ 用于正则表达式本身。

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 2013-10-07
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多