regex - 如何使用 REGEX perl 提取两个模式之间的文本

标签 regex perl

在以下几行中,我如何使用 REGEX PERL 在变量中存储“ 描述:”和“ 标签:”之间的行,以及使用什么是好的数据类型,字符串或 list 还是别的什么?

(我正在尝试用 Perl 编写一个程序来提取带有 Debian 包信息的文本文件的信息,并将其转换为 RDF(OWL)文件(本体)。)

说明:用于解码 ATSC A/52 流的库(开发)
liba52 是一个用于解码 ATSC A/52 流的免费库。 A/52 标准是
用于各种应用,包括数字电视和 DVD。这是
也称为 AC-3。

这个包包含开发文件。
首页:http://liba52.sourceforge.net/

标签:开发::库,角色::开发库

到目前为止我写的代码是:

#!/usr/bin/perl
open(DEB,"Packages");
open(ONT,">>debianmodelling.txt");

$i=0;
while(my $line = <DEB>)
{

    if($line =~ /Package/)
    {
        $line =~ s/Package: //;
        print ONT '  <package rdf:ID="instance'.$i.'">';
        print ONT    '    <name rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</name>'."\n";
    }
elsif($line =~ /Priority/)
{
    $line =~ s/Priority: //;
    print ONT '    <priority rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</priority>'."\n";
}

elsif($line =~ /Section/)
{
    $line =~ s/Section: //;
    print ONT '    <Section rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</Section>'."\n";
}

elsif($line =~ /Maintainer/)
{
    $line =~ s/Maintainer: //;
    print ONT '    <maintainer rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</maintainer>'."\n";
}

elsif($line =~ /Architecture/)
{
    $line =~ s/Architecture: //;
    print ONT '    <architecture rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</architecture>'."\n";
}
elsif($line =~ /Version/)
{
    $line =~ s/Version: //;
    print ONT '    <version rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</version>'."\n";
}
elsif($line =~ /Provides/)
{
    $line =~ s/Provides: //;
    print ONT '    <provides rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</provides>'."\n";
}
elsif($line =~ /Depends/)
{
    $line =~ s/Depends: //;
    print ONT '    <depends rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</depends>'."\n";
}
elsif($line =~ /Suggests/)
{
    $line =~ s/Suggests: //;
    print ONT '    <suggests rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</suggests>'."\n";
}

elsif($line =~ /Description/)
{
    $line =~ s/Description: //;
    print ONT '    <Description rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</Description>'."\n";
}
elsif($line =~ /Tag/)
{
    $line =~ s/Tag: //;
    print ONT '    <Tag rdf:datatype="http://www.w3.org/2001/XMLSchema#string">'.$line.'</Tag>'."\n";
    print ONT '  </Package>'."\n\n";
}
$i=$i+1;
}

最佳答案

my $desc = "Description:";
my $tag  = "Tag:";

$line =~ /$desc(.*?)$tag/;
my $matched = $1;
print $matched;

或者
my $desc = "Description:";
my $tag  = "Tag:";

my @matched = $line =~ /$desc(.*?)$tag/;
print $matched[0];

或者
my $desc = "Description:";
my $tag  = "Tag:";

(my $matched = $line) =~ s/$desc(.*?)$tag/$1/;
print $matched;

额外的

如果您的描述和标签可能在不同的行上,您可能需要使用 /s修饰符,将其视为单行,因此 \n不会破坏它。例子:
$_=qq{Description:foo 
      more description on 
      new line Tag: some
      tag};
s/Description:(.*?)Tag:/$1/s; #notice the trailing slash
print;

关于regex - 如何使用 REGEX perl 提取两个模式之间的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237968/

相关文章:

java - 如何在 Java 中使用正则表达式捕获希伯来语?

python - 要求django url中变量的最小长度

Perl 字符串子

arrays - Perl:一次从多个数组中进行grep

perl - 我如何找出我的 Perl 脚本崩溃的原因?

perl - 安全地从信号处理程序访问共享数据结构

regex - 需要过滤日志以搜索最近 5 分钟的行

使用变量作为模式的正则表达式的 JavaScript 语法

c++ - 正则表达式引擎测试

perl - 如何让 Strawberry Perl 的 cpan(1) 找到 perl?