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]*$"