我试图在Java中使用正则表达式从2个标签之间的多行字符串中提取内容。例如,内容可能如下所示:
--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
hello test
...
..
!@#!@%$#^%$&*^(*)*()
..
..
..
..
--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
hello test<br><br>..<br>!@#!@%$#^%$&*^(*)*()<br>.<br><br>.<br>.<br>.<br><br><br><br>.<br><br>
--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_
我想只提取--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_
边界之间的内容。
我使用了一个如下所示的正则表达式:--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_\n?[.\n]+\n?--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_
但它不起作用。我的正则表达式应该是什么来提取内容?此外,在提取时,边界标签是否与内容一起包括在内?
答案 0 :(得分:1)
我强烈建议不要使用正则表达式进行解析。它们并不适合它。只需编写一个解析器来迭代输入,搜索开始标记,设置标记,记录所有后续行,识别结束标记并重置标记。轻松完成,比正则表达式更灵活。
答案 1 :(得分:1)
(?<=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_).*(?=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_)
这个看起来很糟糕的正则表达式可以用来提取你的内容而没有边界。但是,如果输入中没有嵌套的“标记”,则仅会起作用。另外,要使它工作.
必须与换行符匹配。
Pattern regex = Pattern.compile("(?<=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_).*(?=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_)", Pattern.DOTALL);
答案 2 :(得分:0)
如果文件不是那么大,那么你可以将它读入内存一次。你可以用正则表达式提取东西。
但是如果文件是一个巨大的文件,你就会遇到问题,即使你可以将它读入内存,使用正则表达式进行处理也不会很快。
在这种情况下,逐行或作为流读取文件将是解决问题的通用方法。您可以通过阅读来搜索和提取内容。实施起来并不比正则表达式更难。