Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用正则表达式模式无法识别HTML中的空格_Java_Html_Regex_Parsing - Fatal编程技术网

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

Java:使用正则表达式模式无法识别HTML中的空格,java,html,regex,parsing,Java,Html,Regex,Parsing,代码: 我正在尝试用正则表达式解析HTML。程序读取html表中td标记的内容。表格单元格中的内容应符合模式p中定义的特殊模式 现在的主要问题是正则表达式模式与类似“0.1”的单元格内容不匹配。 但是如果我用模式匹配的代码中的值(“0.1”)手动定义字符串s 此外,如果我在调试模式下复制char[]data的内容,并使用此复制内容定义s,则模式也不适合,尽管它看起来与上面手动定义的值相同 有可能找出哪些空白字符是真正被读取的吗 似乎空白并不总是空白,因此与正则表达式类[\s]不匹配。这可能吗 编

代码:


我正在尝试用正则表达式解析HTML。程序读取html表中
td
标记的内容。表格单元格中的内容应符合
模式p
中定义的特殊模式

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

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

有可能找出哪些空白字符是真正被读取的吗

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

编辑:

谢谢你的回答。它实际上是一个空白字符(\xA0),未被\s regex类识别

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


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

您的代码片段太长了,但据我所知,您只需要模式来匹配
0.0
10.52
等,即浮点数?使用模式
\\d+\.\\d+

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

以下是使用示例:

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) {
}
}

顺便说一句,注意
匹配()
匹配整行。如果要匹配行的一部分,请使用
find()
。我个人总是使用
find()
,并在需要时在正则表达式中使用开始和结束行标记
^
$

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

String str = "123.456";
Pattern p = Pattern.compile("\\d+\\.\\d+");
Matcher m = p.matcher(str);
if (m.matches()) {
    // do something.
}
还有其他Unicode空白字符与
\s
不匹配,但没有一个像NBSP一样常见


或者,如果您正在运行Java 7+,您可以指定并继续使用
\s

,这是您的主要问题:。不要使用正则表达式,而是使用一个库,就像你正在违反编程的十条戒律之一一样。不要使用正则表达式来解析HTML。阅读以下内容:@jlordo是的,但是trim()函数不会出于任何原因删除空格。“我正在尝试用正则表达式解析HTML。”每当你发现自己在说这些时,停止你正在做的事情,远离键盘。然后,学习如何使用XML解析器。然后--只有到那时--您才应该继续。HTML通常包含不间断的空格(代码点160),这些空格与
\s
String.trim()使用的空格定义不匹配<代码>\s
仅匹配
[\t\n\x0B\f\r]
并且
修剪
仅将<0x20的代码点视为空格。
"^[\\s\\xA0]*\\d+\\.\\d+[\\s\\xA0]*$"