正则表达式请求?

时间:2014-08-04 12:47:32

标签: regex perl

我是Regex的新手我想将这种不同的输入情况转换为预期输出。


输入

案例1:

<sec id="S&#x005F;4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)</italic>.</title>

案例2:

 <sec id="S&#x005F;4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>).</italic></title><br>

案例3:

<sec id="S&#x005F;4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)<bold>.</bold></italic></title>


预期产出:

<sec id="S&#x005F;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;
}

2 个答案:

答案 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&#x005F;4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)</italic>.</title>
<sec id="S&#x005F;4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>).</italic></title>
<sec id="S&#x005F;4"><label>2.2.6.4.</label><title><italic> Content abc (<bold>15</bold>)<bold>.</bold></italic></title>

输出:

<sec id="S&#x005F;4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>
<sec id="S&#x005F;4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>
<sec id="S&#x005F;4"><label>2.2.6.4.</label><title> Content abc (<bold>15</bold>)</title>