XML title Шаблон регулярных выражений

Это мой ввод в статью, свойства изменят что угодно.

Входные данные :

 <article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:oasis="http://www.niso.org/standards/z39-96/ns/oasis-exchange/table" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.0" xml:lang="en">

Выход:

<article article-type="research-article"  xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" >

Я пытаюсь это регулярное выражение, но не могу сделать дальше.

<article(?: [^>]+)? article-type="research-article"(?: [^>]+)? xmlns:mml="http://www\.w3\.org/1998/Math/MathML"(?: [^>]+)?>

2 ответа

Вы можете уменьшить регулярное выражение как

<article (xmlns:mml=[^ ]*)\s.*(xmlns:xlink=[^ ]*).*(article-type=[^ ]*).*

Строка замены может быть <article $3 $1 $2>

который дает вывод как

<article article-type="research-article" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">

Например, см. http://regex101.com/r/pX1yI6/1

РЕДАКТИРОВАТЬ

если вы не уверены в порядке, в котором может иметь место значение свойства, лучше использовать отдельные соответствия для каждого из свойств, которые вы хотите извлечь

Например

$str =~ m#(xmlns:mml[^ ]*)#;
$mml=$1;
$str =~ m#(xmlns:xlink[^ ]*)#;
$xlink=$1;
$str =~ m#(article-type[^ ]*)#;
$type=$1;

$output = "<article $type $mml $xlink >";

print $output;

будет производить вывод как

<article article-type="research-article" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" >bash-3.2$ nano xml.pl

Вы также можете попробовать это: поскольку шаблон регулярного выражения не может быть переброшен к разделителям '<' '>'.

print "<$1$2$3$4>\n", if($match=~m{<(article)[^>]*(xmlns:mml="[^"]*")[^>]*(xmlns:xlink="[^"]*")[^>]*(article-type="[^"]*")[^>]*>})
Другие вопросы по тегам