2013-09-12 4 views
0
<ref id="ch02_ref1"><mixed-citation publication-type="journal"><person-group person-group-type="author"><name><surname>J.M.</surname><given-names>Astilleros</given-names></name> 

Это отдельная строка. Мне просто нужно извлечь слово между тегами <given-names> и </given-names>, которые в этом случае составляют Astilleros. Есть ли регулярное выражение для этого. Проблема, с которой я сталкиваюсь, заключается в том, что между каждым словом и конечным тегом не существует пробела </given-names> где '/' является символом в perl regex .. пожалуйста, помогите ..Perl регулярное выражение

Идея состоит в том, чтобы получить имена, найти их в тексте на странице и поместить <given-names>Astilleros</given-names> тегов вокруг них .. Я обязательно попробовать XML парсер ..

+0

Для использования/в регулярном выражении Perl, вы можете использовать альтернативный набор ограничителей, таких как '{} ':' m {. *?} '. – Thilo

+2

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

+0

Идея состоит в том, чтобы получить имена, найти их в тексте на странице и поместить в них теги Astilleros. Я обязательно попробую XML-парсеры .. –

ответ

2

Не разобрать XML с regexes - просто слишком сложно получить право. Есть хорошие парсеры, которые лежат вокруг, просто ждут, чтобы их использовали. Давайте использовать XML::LibXML:

use strict; use warnings; 
use XML::LibXML; 

my $dom = XML::LibXML->load_xml(string => <<'END'); 
<ref id="ch02_ref1"> 
    <mixed-citation publication-type="journal"> 
    <person-group person-group-type="author"> 
     <name> 
     <surname>J.M.</surname> 
     <given-names>Astilleros</given-names> 
     </name> 
    </person-group> 
    </mixed-citation> 
</ref> 
END 

# use XPath to find your element 
my ($name) = $dom->findnodes('//given-names'); 
print $name->textContent, "\n"; 

(! Все, что вы попробуете, не использовать XML :: Simple)

+0

Это дает мне ошибку 'Не удается найти метод объекта textContent" через пакет "XML :: LibXML :: NodeList" '. И документация довольно ужасная. – TLP

+0

@TLP Спасибо, я исправил его. Документы ужасно, но большая часть из них является стандартным DOM, как видно на JavaScript. – amon

0

Это должно работать как регулярное выражение:

/<given-names>(.*?)</ 

с вашего входа, он будет захватывать Astilleros

Это соответствует:

  • Буквальное <given-names>
  • Захватывает (от 0 до бесконечных раз) любой символ (за исключением символа новой строки)
  • До тех пор, пока не достигнет буквальным <
+0

Не будет работать для 'Jean- Baptiste 'или' Jean Luc '. – Thilo

+1

'. *?' Не будет работать с вложенными тегами. – TLP

+0

Пробовал и работал чудесами, но не работал с двумя названиями частей, такими как Жан Люк, как сказал Тило. Спасибо за выражение .. –

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