正则表达式,用于获取多行字符串中2个标记之间的内容

时间:2011-10-24 12:22:51

标签: java regex

我试图在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_

但它不起作用。我的正则表达式应该是什么来提取内容?此外,在提取时,边界标签是否与内容一起包括在内?

3 个答案:

答案 0 :(得分:1)

我强烈建议不要使用正则表达式进行解析。它们并不适合它。只需编写一个解析器来迭代输入,搜索开始标记,设置标记,记录所有后续行,识别结束标记并重置标记。轻松完成,比正则表达式更灵活。

答案 1 :(得分:1)

(?<=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_).*(?=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_)

这个看起来很糟糕的正则表达式可以用来提取你的内容而没有边界。但是,如果输入中没有嵌套的“标记”,则会起作用。另外,要使它工作.必须与换行符匹配。

Pattern regex = Pattern.compile("(?<=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_).*(?=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_)", Pattern.DOTALL);

答案 2 :(得分:0)

如果文件不是那么大,那么你可以将它读入内存一次。你可以用正则表达式提取东西。

但是如果文件是一个巨大的文件,你就会遇到问题,即使你可以将它读入内存,使用正则表达式进行处理也不会很快。

在这种情况下,逐行或作为流读取文件将是解决问题的通用方法。您可以通过阅读来搜索和提取内容。实施起来并不比正则表达式更难。