Регулярное выражение для получения содержимого между 2 тегами в многострочной строке - PullRequest
1 голос
/ 24 октября 2011

Я пытаюсь использовать регулярные выражения в 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 ]

1 голос
/ 24 октября 2011
(?<=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_).*(?=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_)

Это ужасно выглядящее регулярное выражение может использоваться для извлечения вашего контента без границ.Однако это будет только , если во входных данных нет вложенных «тегов».Кроме того, чтобы это работало, . должен соответствовать символу новой строки.

Pattern regex = Pattern.compile("(?<=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_).*(?=--_000_CAKETFEgg78oKKJPNySnxF4BgQoh9ifHP4XzXGeJddUvOtz5wmailgm_)", Pattern.DOTALL);
1 голос
/ 24 октября 2011

Я бы настоятельно рекомендовал не использовать регулярные выражения для разбора. Они не очень подходят для этого. Просто напишите синтаксический анализатор, который перебирает ваши входные данные, ищет начальный тег, устанавливает флаг, записывает все последующие строки, распознает конечный тег и сбрасывает флаг. Легко сделать и намного гибче, чем регулярное выражение.

0 голосов
/ 24 октября 2011

Если файл не такой большой, скажем, вы можете прочитать его один раз в память.Вы можете извлечь вещи с помощью регулярных выражений.

Однако, если файл является огромным файлом, у вас будут проблемы, даже если вы сможете прочитать его в память, обработка с регулярным выражением не будет быстрой.

В этом случае чтениефайл строка за строкой или в виде потока будет общим способом решения проблемы.Вы можете искать и извлекать контент, читая.Это не будет труднее реализовать, чем регулярное выражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...