2012-06-28 1 views
0

Я ищу сделать регулярное выражение, которое получает все данные в следующем формате:Regex чтобы получить все данные между> и <

">DATA<" returns "DATA" 

"> DATA <" returns " DATA " 

">.4930894812948cm <" returns ".4930894812948cm " 

"> [email protected]$%^^ < > << <" returns " [email protected]$%^^ < > << " 

">DATA< blah blah blah >DATA123<BLah>DATA456<" returns "DATA", "DATA123" and "DATA456" 

(Цитаты в примерах есть, чтобы сделать их более удобными для чтения; они не должны появляться в реальных результатах.)

DATA может быть любой кодировке

>DATA< может быть расположен в любом месте в текстовом файле, поэтому он может быть повторен один за другим. Кроме того, по всем данным, я имею в виду все, в том числе \n, \r, ., зарезервированных символов и т.д.

Я попытался >(.*?)<, но это не сработало.

Я делаю это на Java.

Добавление другого примера:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Integer facilisis neque tellus, eget rhoncus sapien. 
Pellentesque placerat purus non eros auctor ut consectetur magna bibendum. 
Nam sollicitudin cursus >urna< nec varius. 
Pellentesque elit augue, semper non porttitor nec, adipiscing ut ligula. 
Cras accumsan >dolor< augue. 
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. >Sed< >rhoncus< ultrices elementum. 

    >lac 
    us< 

Ut elementum condimentum est > pir. < feugiat. 

Если отметить:

"urna" 
"dolor" 
"Sed" 
"rhoncus" 
"la 
    cus" 
" pir. " 

... включая пространство между ними и разделителями строк. Надеюсь это поможет.

+5

Скажите, что вы не используете регулярное выражение для разбора x/html. –

+0

Каков ожидаемый результат этого: '> sajhgdsjf <Обычный текст asdsad много dfjkhsdkjf sdfkjdshf> 2348723 nhahtdh

+0

предполагая, у меня есть этот код: ' Pattern р = Pattern.compile (Regex), '' Сличитель м = p.matcher (DOCUMENT); ' ' while (m.find()) {.... вернуть каждый повторяющийся файл ....} ' Результат должен быть:« sajhgdsjf »и« 2348723 »без котировок –

ответ

2

Вот регулярное выражение вы хотите: (?)

>(.*)< 

Вы не хотите использовать ленивый оператор. Ленивый оператор заставляет подстановочный знак останавливаться как можно раньше и по-прежнему продолжает регулярное выражение (поэтому он останавливается на FIRST <), однако без?, Подстановочный знак является жадным и будет соответствовать всем символам, а затем работать назад, пока не найдет LAST <.

+0

Не работает. в случае, когда я повторил> DATA < blah blah > DATA < blah blah > DATA <он вернет плохие результаты, такие как «DATA> DATA <» и т. д. –

+1

@link_boy Я не думаю, что regex - это ответ, тогда –

+0

:(Я был так близок, он проанализировал все, кроме случаев, когда у меня было '.' в данных. –

0

Имея некоторые трудности различая именно то, что ОП хочет, но ...

>([^<]*)< будет возвращать значения между> и <, включая любые символы (в том числе> и пространства), которые могут быть между ними.

Итак:

"> ABC <" вернется "ABC"

"> AB> C> D <" вернется "AB> C> D"

"> ABC" ничего не вернет

Тестовый кейс находится здесь: fiddle. (Нажмите ссылку «Java».)

+0

Образец, похоже, не скомпилировал это хорошо. –

+0

@link_boy - Я обновил шаблон и добавил пример на скрипке. –

0

Если данные, которые попали между ними, были случайными, я бы предложил глобальную + многострочную \>([^\<])*\<. Однако, поскольку данные - это случайный, я не думаю, что вы могли бы придумать одно регулярное выражение, которое надежно захватило бы все возможные символы, которые будут падать между > и <.

+1

Проверьте примеры еще раз, он хочет, чтобы он захватил <в некоторых случаях –

+0

Однако он не будет записывать <внутри данных. > DATA << wont get "DATA <" –

+0

Хотите ли мы захватить все между первым '' 'и последним' ''? Я не сужу, как бы вы могли различать несколько экземпляров '> data <' then. – woemler

Смежные вопросы