正则表达式:如何从行中删除初始和最终引号

时间:2017-01-24 16:05:18

标签: regex perl

我希望您在创建正则表达式时寻求帮助。 我有像记事本++这样的东西我只有一个字段来放置正则表达式/这个软件使用perl来解析/所以我不能使用编程语言。 正则表达式应匹配行的开头和结尾的引号/有时在最终引用后使用分号/但没有内容,因为我正在使用它来删除提到的引号。

输入数据:

"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
Lorem ipsum dolor sit amet, "consectetur" adipiscing elit.
"Lorem" ipsum dolor sit amet, "consectetur" adipiscing "elit."

预期结果:

Lorem ipsum dolor sit amet, consectetur adipiscing elit
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, "consectetur" adipiscing elit.
"Lorem" ipsum dolor sit amet, "consectetur" adipiscing "elit"

谢谢,
马丁

4 个答案:

答案 0 :(得分:0)

这可能会解决您的问题:

^"(.+)";?$

看到working on regex101.com(并注意修饰符!)。

答案 1 :(得分:0)

                Color obter_cor_pixel = frame_drone.Bitmap.GetPixel((int)ponto_medio_x, (int)ponto_medio_y); //obtem cor do pixel no ponto médio
                                                                                                             //RGB para HSV                 

                Color obter_cor_circulo = frame_drone.Bitmap.GetPixel((int)ponto_medio_circulo.X, (int)ponto_medio_circulo.Y); //obtem cor do pixel no ponto médio
                                                                                                                               //RGB para HSV


                var media_obter_cor_circulo = (obter_cor_circulo.B + obter_cor_circulo.G + obter_cor_circulo.R) / 3;
                int variacao = 25;
                int valor_min = 150;
                if (((media_obter_cor_circulo - variacao <= obter_cor_circulo.B) && (media_obter_cor_circulo + variacao > obter_cor_circulo.B) &&
                    (media_obter_cor_circulo - variacao <= obter_cor_circulo.G) && (media_obter_cor_circulo + variacao > obter_cor_circulo.G) &&
                    (media_obter_cor_circulo - variacao <= obter_cor_circulo.R) && (media_obter_cor_circulo + variacao > obter_cor_circulo.R)) && (obter_cor_circulo.R <= valor_min) && (obter_cor_circulo.G <= valor_min) && (obter_cor_circulo.B <= valor_min))
                {

                    circulo_encontrado++;
                }


                float hue = obter_cor_pixel.GetHue();

                if (hue > 190 && hue < 280 /*&& hue2 > 170 && hue2 < 280*/)
                {
                    //frame_drone.Draw("Azul", ref f, new System.Drawing.Point((int)ponto_medio_x, (int)ponto_medio_y), new Bgr(Color.White)); //Escrever na imagem a cor no ponto medio                                                                                    
                    cores_dos_pontos_medios[incrementa_ponto_medio] = "Azul";
                }
                else if (hue > 70 && hue < 190 /*&& hue2 > 70 && hue2 < 170*/)
                {
                    //frame_drone.Draw("Verde", ref f, new System.Drawing.Point((int)ponto_medio_x, (int)ponto_medio_y), new Bgr(Color.White)); //Escrever na imagem a cor no ponto medio           
                    cores_dos_pontos_medios[incrementa_ponto_medio] = "Verde";
                }
                else if (hue >= 25 && hue <= 60 /*&& hue2 >= 25 && hue2 <= 60*/)
                {
                    //frame_drone.Draw("Amarelo", ref f, new System.Drawing.Point((int)ponto_medio_x, (int)ponto_medio_y), new Bgr(Color.White)); //Escrever na imagem a cor no ponto medio           
                    cores_dos_pontos_medios[incrementa_ponto_medio] = "Amarelo";
                }
                else if ((hue > 330 && hue <= 360) || hue > 0 && hue <= 20)
                {
                    //frame_drone.Draw("Vermelho", ref f, new System.Drawing.Point((int)ponto_medio_x, (int)ponto_medio_y), new Bgr(Color.White)); //Escrever na imagem a cor no ponto medio           
                    cores_dos_pontos_medios[incrementa_ponto_medio] = "Vermelho";
                }

当行以引号开头并以引号结尾(加号或减号分号)时,将捕获引号内的数据。 如果引号未出现在行的开头和结尾,则结果中将包含任何其他引号。

有效负载位于第二个捕获的组中,因此您要忽​​略第一个结果(或在运行模式匹配后执行my (undef, $result) = $input =~ /^("?)(.+?)\1;?$/; )。

$2

输出:

while (<DATA>) {
    if (/^("?)(.+?)\1;?$/) {
        print $2;
    } else {
        print "No match: $_";
    }
}
__DATA__
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
Lorem ipsum dolor sit amet, "consectetur" adipiscing elit.
"Lorem" ipsum dolor sit amet, "consectetur" adipiscing elit.

答案 2 :(得分:0)

我认为你的意思是所有的行,除了完全围绕引号。

反向引用是关键所在。使用字符类,您甚至可以使用单引号和双引号:

use strict;
use warnings;

my $data = <<'DATA';
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
"Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
Lorem ipsum dolor sit amet, "consectetur" adipiscing elit.
"Lorem" ipsum dolor sit amet, "consectetur" adipiscing elit.
DATA

for ( split /^/, $data ) {
    printf '->%s<-'.$/, $2 if /^(["']?)(.*)\g1;?$/;
}

使用此更新问题的最后一个示例无法使用此解决方案。

答案 3 :(得分:0)

试试这个:

$s = $1 if $s =~ /^"([^"]*)";$/;