2014-09-25 3 views
0

У меня есть текстовый файл в этом формате:Извлечь текст между двумя тегами с помощью Regex

<seg id="1"> They are the same thing. Let's shoot them both. </seg> 
    <seg id="1"> We can't wait for you to move back either. </seg> 
    <seg id="2"> You seem quite uptight. </seg> 
    <seg id="3"> Does your wife (who is also your sister) not give it up any more? </seg> 
    <seg id="1"> Can domestic violence abusers be rehabilitated? http://usat.ly/1rwvgWf </seg> 
    <seg id="1"> Taulia enables Fortune 500 businesses to electronically handle </seg> 
    <seg id="2"> all invoicing and payment to their suppliers </seg> 

Я хотел бы получить содержимое тегов в следующем формате:

They are the same thing. Let's shoot them both. 
    We can't wait for you to move back either.You seem quite uptight.Does your wife (who is also your sister) not give it up any more? 
    Can domestic violence abusers be rehabilitated? http://usat.ly/1rwvgWf 
    Taulia enables Fortune 500 businesses to electronically handle all invoicing and payment to their suppliers 

, как вы может видеть содержание seg id = "1", seg id = "2", seg id = "3" печатаются в одной строке, потому что они являются одним сообщением. Кроме того, содержание seg id = "1" и seg id = "2" печатается в одной строке.

Я думаю об использовании java и Regex, но я хотел бы знать, есть ли другой способ получить то, что мне нужно.

+0

Вы просто хотите удалить открывание и удалить теги элементов ''? Или вы действительно хотите сопоставить массив элементов '' элементов? – Sam

+0

Я хочу совместить массив содержимого элементов . в примере вы можете сказать, что seg 1,2,3 являются acutaly одной почтой. Поэтому я хотел бы объединить их всех в один пост. Я хотел бы знать, есть ли у кого-нибудь идея, как с этим справиться ... – user3001418

+0

Er, XML Parser? Похоже, SAX + StringBuilder - это все, что вам нужно. – Stewart

ответ

2

Для каждой строки line:

line = line.replaceAll("<.*?>(.*?)</.*?>", "$1"); 
  • Обнаружение открытия <.*?>
  • и закрытие </.*?> тег
  • создать группу 1 (.*?) между
  • заменить выражение соответствия всей группой $1.
2

Результаты будут в группе захвата одного, если вы делаете матч:

/<seg\b[^>]*>(.*?)<\/seg>/g 

Demo

+0

Выход отличается от того, что я хочу. Я хочу сделать seg 1,2,3 для печати в одной строке не в отдельных строках. – user3001418

+0

@ user3001418 [понравилось] (http://regex101.com/r/rW8xF2/2)? – Sam

1

Попробуйте следующее:

String input = " <seg id=\"1\"> They are the same thing. Let's shoot them both. </seg>\n <seg id=\"1\"> We can't wait for you to move back either. </seg>\n <seg id=\"2\"> You seem quite uptight. </seg>\n <seg id=\"3\"> Does your wife (who is also your sister) not give it up any more? </seg>\n <seg id=\"1\"> Can domestic violence abusers be rehabilitated? http://usat.ly/1rwvgWf </seg>"; 

String[] array = input.replaceAll("\\s*<seg[^>]+>", "").split("</seg>"); 

Если прочитать файл по линии, наилучшим вариантом является:

String line = line.replaceAll("</?seg[^>]*>"); 

Если вы хотите, чтобы удалить начальные и завершающие пространство:

String line = line.replaceAll("\\s*</?seg[^>]*>\\s*"); 
0

Лучше вы можете попробовать это поможет вам много.

use strict; 
use warnings; 
my $string = qq(<seg id="1"> They are the same thing. Let's shoot them both. </seg> 
    <seg id="1"> We can't wait for you to move back either. </seg> 
    <seg id="2"> You seem quite uptight. </seg> 
    <seg id="3"> Does your wife (who is also your sister) not give it up any more? </seg> 
    <seg id="1"> Can domestic violence abusers be rehabilitated? http://usat.ly/1rwvgWf </seg> 
    <seg id="1"> Taulia enables Fortune 500 businesses to electronically handle </seg> 
    <seg id="2"> all invoicing and payment to their suppliers </seg>); 
$string =~ s{<seg(?: [^>]+)?>((?:(?!</?seg[ >]).)*)</seg>}{$1}ig; 
print $string;exit; 
+0

Спасибо ,,,, Но это не то, что я хочу. что я хочу, так это то, что seg1,2,3 следует печатать в одной строке следующим образом: «Мы не можем дождаться, когда вы снова вернетесь. Вы, кажется, очень взволнованы. Ваша жена (которая тоже ваша сестра) не перестаньте? и seg1,2 должны быть напечатаны в той же строке «Taulia позволяет предприятиям Fortune 500 электронным способом обрабатывать все выставления счетов и оплаты их поставщикам» – user3001418

0

Даже не пытайтесь. XML не является обычным языком [технический термин], поэтому регулярные выражения являются неправильным инструментом для задания. Смотрите знаменитый пост здесь:

RegEx match open tags except XHTML self-contained tags

Используйте XML-анализатор.

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