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="[^"]*")[^>]*>})