我是Regex的新手我想将这种不同的输入情况转换为预期输出。
案例1:
<sec id="S_4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)</italic>.</title>
案例2:
<sec id="S_4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>).</italic></title><br>
案例3:
<sec id="S_4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)<bold>.</bold></italic></title>
预期产出:
<sec id="S_4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>
我想删除标题末尾的标点符号,并删除标题中的格式标记。
请为此提供正则表达式。
提前谢谢。
我尝试了这段代码::但是无法做进一步的
while($cnt =~m{<sec( [^>]*)?><label( [^>]+)?>(.*?)</label>)(.*?)(<title( [^>]*)?>)(.*?)</title>)}ig){
my $temp = $5;
$temp = ~s{<title( [^>]*)?>)(.*?)</title>}{}ig;
}
答案 0 :(得分:1)
$clean =~ s{(<sec(?: [^>]+)?>(?:\s*<label(?: [^>]+)?>(?:(?!</?label[ >]).)*</label>)(?:(?!<title[ >]).)*<title(?: [^>]+)?>)(((?:(?!</?title[ >]).)*))</title>\s*}{
my $pre = $1;
my $title = $2;
$title =~ s{((<(bold|italic)>)?((?:(?!</?\1>).)*)(</\3>))(<(bold|italic)>)?([\.])?$}{
my $pre = $2;
my $cnt = $4;
my $post = $5;
$cnt =~s{(<(bold|italic)>)?[\.](</\2>)$}{}ig;
$cnt =~s{[\.]$}{}ig;
qq($pre$cnt$post)
}igse;
qq($pre$title</title>)
}isge;
试试这段代码。这可能对你有帮助。此代码以内联格式编写。
答案 1 :(得分:0)
欢迎使用正则表达式。它们是一个强大的工具,但我强烈建议您使用实际的XML或HTML Parser,如果这是您的数据。
至少应使用/x
modifier来为正则表达式的LHS添加间距。我删除了一些冗余分组以及其他清理工作:
use strict;
use warnings;
while (my $line = <DATA>) {
chomp $line;
$line =~ s{
(
<sec\b[^>]*>
\s*
<label\b[^>]*>
(?:(?!</?label\b).)*
</label>
(?:(?!<title\b).)* # This assumes a <title> under a <sec> (not good)
<title\b[^>]*>
)
(
(?:(?!</?title\b).)*
)
</title>\s*
}{
my $pre = $1;
my $title = $2;
1 while $title =~ s{
\A
([\s\p{Punct}]*)
<(\w+)> (.*) </\2>
([\s\p{Punct}]*)
\z
}{$1$3$4}isgx;
$title =~ s{<(bold|italic)>[.]+</\1>\z}{}i;
$title =~ s{[.]+\z}{};
"$pre$title</title>"
}isgex;
print $line, "\n";
}
__DATA__
<sec id="S_4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)</italic>.</title>
<sec id="S_4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>).</italic></title>
<sec id="S_4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)<bold>.</bold></italic></title>
输出:
<sec id="S_4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>
<sec id="S_4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>
<sec id="S_4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>