【问题标题】:Regex substitution in perlperl 中的正则表达式替换
【发布时间】:2014-05-13 06:07:13
【问题描述】:

在文件中找到的所有创建表 ddls 中,我有一个字符串需要在分号(;)之前插入。

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

输出将是:

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
BLKSIZE 2048;

现在文件中有多个create table ddls,还有其他ddls,如创建目录、模式、视图等。我只希望插入的字符串仅用于create table stmt。

我尝试了以下方法:

sub read_file {
        my ($filename) = @_;
        print "$filename \n";
        open my $in, '<', $filename or carp "Could not open '$filename' for reading $!";
        local $/ = undef;
        my $all = <$in>;
        close $in;
        return $all;
}   

sub write_file {
        my ($filename, $content) = @_;
        open my $out,'>', $filename or carp "Could not open '$filename' for writing $!";
        print $out $content;
        close $out;
        return;
}   

sub changeddl{
        my $data = read_file($_);
        print "$data \n";
        if($data=~m/\s*Create\s*Table.*/im){
                $data=~s/(\s*Create\s*Table).*(;$)/$1 blsize 2048 $2/gmi;
                write_file(($_, $data))
        }
}       

然后我打电话给changeddl 一个文件(其中包含 ddl,但它不起作用。)请帮助。

【问题讨论】:

    标签: regex perl fileslurp


    【解决方案1】:

    我稍微改变了方法,不需要匹配和替换,因为您可以一步完成测试/替换,

    匹配Create\s*Table 以及之后的所有内容都不是; char,在\K 后面使用正面的外观

    if ($data =~ s/Create\s*Table[^;]+\K/blsize 2048/gi) {
       write_file(($_, $data))
    }
    

    【讨论】:

    • 谢谢。有效地工作。非常感谢。
    【解决方案2】:

    您应该使用s(单行)标志而不是gm
    您还应该将 dotall 令牌放入您的第一个捕获组中。

    像这样:

    s/(\s*Create\s*Table.*?);/$1BLKSIZE 2048;/si
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2013-09-27
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多