我有以下正则表达式:
^[0-9a-z]+\.[ ]+(table of )?contents
目的是匹配字符串,例如:
“b。目录”
我正在使用PDFBox来解析pdf文档,我逐行查找上面提到的字符串。有趣的是,当doc找到一个完全符合“b。目录”的字符串时,该字符串无法与正则表达式匹配。
现在我通过在线正则表达式测试仪上手动输入完全相同的字符串进行测试,我得到了一个匹配:
当我尝试复制粘贴解析文本时,看起来与我输入的字符串完全相同,我没有得到匹配:
而且仅供参考,这些是单一空格,没有标签。在进一步检查并比较两个字符串后,似乎解析器中的字符串有一些奇怪的字符表示为空白空间,如下所示:
b.† table†of†contents
但是在记事本上它只是看起来像:
b.† table†of†contents
我必须猜测这是一个编码问题或类似的东西,但是如果我尝试写一个正则表达式来解释这个奇怪的角色,那么仍然没有匹配:
这是我尝试过的正则表达式:
^[0-9a-z]+\.[ †]+(table[ †]+of[ †]+)?contents
那么无论如何都要考虑这个um编码所以正则表达式可以拿起它吗? 如果有人有兴趣,我使用字符串'matches'方法将字符串与我的代码中的正则表达式匹配。
更新
请参阅下面的评论,以获取正则表达式和字符串的链接。
答案 0 :(得分:2)
如果您复制粘贴使用正则表达式的行并打印包含
的字符System.out.println(Arrays.toString("b. table of contents".chars().toArray()));
你会看到结果:
[98, 46, 160, 32, 116, 97, 98, 108, 101, 32, 111, 102, 32, 99, 111, 110, 116, 101, 110, 116, 115]
// ^^^
160
是No-Break Space的索引,与索引为32的简单空格不匹配会导致正则表达式失败。
要解决此问题,请将†
符号替换为这样的空白
^[0-9a-z]+\.[ ]+(table[ ]+of[ ]+)?contents
。
要获得更一般的解决方案,请访问Java doesn't see space in string