精华内容
下载资源
问答
  • Perl匹配非空白字符 ​​​​​ 在Perl中,[^\s]代表非空白符。 [^\s]+表示一次或多次匹配非空白符。 ^在括号[]外时表示开始,即行首。 ^在括号[]内时表示将第一位取反,所以\s是空白,在括号内[^\s]就是非空白...

                               Perl匹配非空白字符[^\s]

    ​​​​​

    一、Perl匹配非空白字符[^\s]

    1. 在Perl中,[^\s]代表非空白符。
    2. [^\s]+表示一次或多次匹配非空白符。
    3. ^在括号[]外时表示开始,即行首。
    4. ^在括号[]内时表示将第一位取反,所以\s是空白,在括号内[^\s]就是非空白。

     

    二、Perl元字符(Meta-character)

    • '\' : 在任何元字符前面加上反斜线,就会使它失去元字符的特殊作用。例如/3\.1415/这个模式里没有通配符
    • '^' : 匹配行首;在字符集中它是脱字符,表示求补集
    • '$' : 匹配行尾(或结尾处新行之前字符)
    • '.' : 除新行(newline)外的任一字符('/s'选项将使'.'匹配新行字符) ---不能匹配换行符'\n'
    • '|' : 或,表示左边匹配或右边匹配都可以
    • '('与')' : 分组,例如 “/(fred)+/” 可匹配“fredfredfred”这样的字符串,并且按顺序将匹配到的内容存储在变量$1、$2、$3 ... 中,注意:$1、$2、$3 ...中的内容不能作修改,需要修改的话需要通过其他棉量缓存一下
    • '['与']' : 字符类。表示一类字符集合中任意一个,方括号内可使用'-'表示范围,如[0-9]表示匹配数字0到9; 也可使用'^‘表示求补集,如[^0-9]表示除数字0到9外的其他字符


    三、量词(Quantifier) ---下面量词中的前三个字符也是元字符

    • '*' : 0或任意次。例如“\t*”表示0到任意多个字表符;“.*”捡破烂模式,它能通吃所有的字符串 --- 元字符
    • '+' : 1或更多次 --- 元字符
    • '?' : 0或1次 --- 元字符
    • {n} : n次
    • {n,} : 至少n次
    • {n, m} : n到m次。例如“/a{5,15}/”可以匹配重复5到15次的字母a

     

    四、自动匹配变量

    • $`: 匹配部分的前一部分存放在$`之中,后面的符号在键盘左上方与“ ~ ”在一个键上
    • $&:整个被匹配上的部分保存在这个变量中
    • $':这个变量保存了字符串中剩下的部分,即除了匹配部分的前一部分,被匹配上的部分后剩下的部分。

     

    五、匹配方式

    • 贪婪(greedy)方式:在模式其余部分匹配前提下,尽可能多地匹配字符。

           贪婪量词:+和* 

    • 非贪婪匹配(minimum): 对于每一个贪婪的量词,都有一个非贪婪的量词。以加号(+)为例, 我们可以改用非贪婪的量词+?,这表示一次或更多匹配(加号的本意)。但是匹配的字符串却   是越短越好,而不再是越长越好。

            非贪婪量词:+?和*?

    • 占有式:与贪婪方式相近,尽可能多地匹配字符,但绝不回退(backtrack,即使模式其余部分无法匹配,也不减少本部分的匹配数量)。在数量词之后使用'+'表示使用占有式匹配。


    六、转义序列

    • '\t' : 制表符(HT, TAB)
    • '\n' : 换行(LF, NL)
    • '\r' : 回车(CR)
    • '\f' : 进纸(Form Feed, FF)
    • '\a' : 报警 (Alarm, BEL)
    • '\e' : 转义(ESC)
    • "\0xx" : 八进制数值对应字符,如\033表示ESC
    • "\xhh" : 16进制数值对应字符,如\x1B表示ESC
    • "\x{hhhh}" : 16进制long型数值对应字符,如\x{263a}表示unicode SMILEY
    • "\cK" : K可以为任意字母,表示控制字符"control-K","\cK"表示如VT
    • "\N{name}" : unicode命名字符
    • "\N{U+hhhh}" : unicode字符
    • '\l' : 小写下一字符
    • '\u' : 大写下一字符
    • '\L' : 小写随后字符串直至'\E'
    • '\U' : 大写随后字符串直至'\E'
    • '\E' : 结束大小写转换
    • '\Q' : 引用随后字符(禁止转义)直至'\E'


    七、字符类及其他转义字符

    • '\w' : 匹任任一单词(word)字符(26个英文字母、10个数字,加下划线'_'),等同于字符集[A-Za-z0-9_]
    • '\W' : 匹配任一非单词字母
    • '\s' : 任一空白字符(空格' ', 制表符'\t'等)
    • '\S' : 任一非空白字符
    • '\d' : 任一数字字符[0-9]
    • '\D' : 任一非数字字符
    • “\pP” : 匹配命名属性P
    • "\PP" : 匹配非P
    • '\X' : 匹配unicode扩展字符集(eXtended grapheme cluster)
    • '\C' : 匹配单个C字符(字节),即使工作在unicode模式下
    • '\n' : n为数字,后向引用指定组n
    • "\gn" : 后向引用指定组n
    • "\g{-n}" : 表示相对(当前位置之前的)第n个后用引用组n
    • "\g{name}" : 后向引用命名组(name)。例如“(/(.)\g{1}ll)”可以匹配aall这样的字符串,aa为连续相同的两个字符
    • "\k{name}" : 后向引用
    • '\K' : 使\K左侧部分,不引入到$&中
    • '\N' : 除'\n'外的任一字符
    • '\v' : 垂直空白符
    • '\V' : 非垂直空白符
    • '\h' : 水平空白符
    • '\H' : 非水平空白符
    • '\R' : 行分割符号


    八、POSIX字符类

     8.1 POSIX字符类表示语法:[:class:], 在pattern中则必须写为"[[:class:]]"

    • "[[:alpha:]]" : (英文)字母
    • "[[:alnum:]]" : 字母或数字字符
    • "[[:ascii:]]" : ASCII字符集中字符
    • "[[:blank:]]" : GNU扩展,等价于空格' '或水平制表符'\t'
    • "[[:cntrl:]]" : 任一控制字符
    • "[[:digit:]]" : 任一数字字符,等价于'\d'
    • "[[:graph:]]" : 除空格外的任一可打印字符
    • "[[:lower:]]" : 任一小写字符
    • "[[:print:]]" : 任一可打印字符,包括空格
    • "[[:punct:]]" : 除单词字符(字母,'_')外的任一图形字符
    • "[[:space:]]" : 任一空白字符,等价于'\s'垂直制表符"\cK"
    • "[[:upper:]]" : 任一大写字符
    • "[[:word:]]" : Perl扩展, 等价于'\w'
    • "[[:xdigit:]]" : 任一16进制数字


     8.2 Perl中,"[[^:class:]]"表示posix指定类的补集,这种情况下也可略去[::],在类名前加'^'表示为"[^class]"。

    • '\b' : 单词边界。例如整单词搜索模式“/\bFred\b/”,可以匹配Fred或fred
    • '\B' : 非单词边界
    • '\A' : 字符串首
    • '\Z' : 字符串尾或尾部换行字符之前
    • '\z' : 字符串尾
    • '\G' : 在上一个匹配处进行匹配

     

     

    展开全文
  • Perl 匹配后赋值

    2020-12-14 17:14:14
    当我们需要用到一行字符中的某些字符串时,我们需要匹配到想要的字符串,再赋值给变量,以便后续使用。 #!/usr/bin/perl &getlef; sub getlef{ if(-e "N7.lef"){ unlink "N7.lef"; } open LIST, "list" ...

    当我们需要用到一行字符中的某些字符串时,我们需要匹配到想要的字符串,再赋值给变量,以便后续使用。

    #!/usr/bin/perl
    
    &getlef;
    
    sub getlef{
        if(-e "N7.lef"){
            unlink "N7.lef";
        }
        open LIST, "list" or die $!;
        @list=<LIST>;
        $count=0;
        foreach my $cell(@list){
            chomp $cell;
            if($cell=~/(\S*)\s(\S*)\s(\S*)\s(\S*)/){
                $N7_lib=$1;
                $N7_cell=$2; 
                $N5_lib=$3;
                $N5_cell=$4;   
            }
            $path="./" . "$N7_lib" . "/lef/" . "$N7_cell" . ".lef";
            open LEF, "$path" or die $!;
            open OUT, ">>N7.lef" or die $!;
            while ($lines=<LEF>){
                if($lines=~/^MACRO.*$N7_cell/){
                    $line_flag=1;
                }
                elsif($lines=~/^END.*$N7_cell/ and $line_flag==1 ){
                    $line_flag=0;
                    print OUT $lines;
                    print OUT "\n";
                    $count++;
                    print "$cell completed $count\n";
                    close LEF;
                    close OUT;
                    last;
                }
                if($line_flag==1){
                    print OUT $lines;
                }
            }
        }
    close LIST;
    chmod 0755, "N7.lef";
    }
    解析:
    1.
    if($cell=~/(\S*)\s(\S*)\s(\S*)\s(\S*)/){
        $N7_lib=$1;
        $N7_cell=$2; 
        $N5_lib=$3;
        $N5_cell=$4;   
    }
    这里采用了正则表达式进行匹配,\S(大写的S)匹配的是非空格,\s(小写的s)匹配空格,*表示匹配任意个字符,这里匹配到了list文档中的内容:
    N7 AO222_LVT_N7 N5 AO222_LVT_N5
    
    $1对应第一个()内匹配的字符串,即N7
    $2对应第二个()内匹配的字符串,即AO222_LVT_N7
    $3对应第三个()内匹配的字符串,即N5
    $4对应第四个()内匹配的字符串,即AO222_LVT_N5
    
    2.
    if(-e "N7.lef"){
            unlink "N7.lef";
    }
    if(-e "N7.lef") 如果存在N7.lef这个文件
    unlink "N7.lef"; 删除N7.lef这个文件,在Perl中,unlink用于删除
    
    3.
    &getlef; 调用子程序
    
    sub getlef{
    }
    sub 子程序名称{} 这是子程序块

    如果list文件中每一行的字符串是由分隔符(可以是字符,也可以是字符串)分隔开,那么我们可以用split操作来获取字符串并赋值。

    @fields = split /separtor/, $string;

    /separtor/是模式(pattern),所以只要能匹配上指定的模式,那么由这种模式分隔开的字符串就可以作为列表返回回来。

    Example:

    #!/usr/bin/perl
    @files=split/A[A-Z]+A/, "appleABCDAbananaAZZZAorangeAFFFAgrape";
    print "$files[0]\n";
    print "$files[1]\n";
    print "$files[2]\n";
    print "$files[3]\n";
    输出结果:
    apple
    banana
    orange
    grape
    
    这里以A开头并以A结尾中间都是大写字母的这样的字符串分隔开了以上字符串,所以用/A[A-Z]+A/进行模式匹配,返回子串

    回到文章开头的例子,也可以用split操作来处理

    list文档内容如下(空格隔开):
    N7 AO221_lvt10 N5 AO221_lvt08
    N7 OA222_svt10 N5 OA222_svt08
    N7 ADD_ulvt10  N5 ADD_ulvt08
    #!/usr/bin/perl
    
    &getlef;
    
    sub getlef{
        if(-e "N7.lef"){
            unlink "N7.lef";
        }
        open LIST, "list" or die $!;
        @list=<LIST>;
        $count=0;
        foreach my $cell(@list){
            chomp $cell;
            @split_cell=split/ /, "$cell";
            $N7_lib=$split_cell[0];
            $N7_cell=$split_cell[1]; 
            $N5_lib=$split_cell[2];
            $N5_cell=$split_cell[3];   
            
            $path="./" . "$N7_lib" . "/lef/" . "$N7_cell" . ".lef";
            open LEF, "$path" or die $!;
            open OUT, ">>N7.lef" or die $!;
            while ($lines=<LEF>){
                if($lines=~/^MACRO.*$N7_cell/){
                    $line_flag=1;
                }
                elsif($lines=~/^END.*$N7_cell/ and $line_flag==1 ){
                    $line_flag=0;
                    print OUT $lines;
                    print OUT "\n";
                    $count++;
                    print "$cell completed $count\n";
                    close LEF;
                    close OUT;
                    last;
                }
                if($line_flag==1){
                    print OUT $lines;
                }
            }
        }
    close LIST;
    chmod 0755, "N7.lef";
    }
    解析:
    method1:
    if($cell=~/(\S*)\s(\S*)\s(\S*)\s(\S*)/){
        $N7_lib=$1;
        $N7_cell=$2; 
        $N5_lib=$3;
        $N5_cell=$4;   
    }
    
    method2:split
    @split_cell=split/ /, "$cell";
    $N7_lib=$split_cell[0];
    $N7_cell=$split_cell[1]; 
    $N5_lib=$split_cell[2];
    $N5_cell=$split_cell[3]; 
    
    观察list的内容可以发现空格是分隔符,所以方法2采用了split操作,获取空格符分开的字符串,并赋值给变量,如果分隔符是分号“;”, 那么就写成split/;/,"$cell"
    

     

    展开全文
  • perl 匹配多个返回数组

    千次阅读 2012-08-28 20:58:01
    perl 匹配多个返回数组my @Strings = ($NewString=~/(9\d{4})/g);     my $NewString = "12312391293429342342139076856123"; my @Strings = ($NewString=~/(9\d{4})/g); my @Result = sort @Strings; print...

    perl 匹配多个返回数组my @Strings = ($NewString=~/(9\d{4})/g);

     

     

    my $NewString = "12312391293429342342139076856123";
    my @Strings = ($NewString=~/(9\d{4})/g);
    my @Result = sort @Strings;
    print "@Result \n";
    print "$Result[$#Result] \n";


     

     

     结果为:

    90768 91293 93423
    93423
    展开全文
  • 作为一个对shell极不熟悉的程序员,很难用到shell的一些单行命令的奇技淫巧,但是perl给出了同样容易的解决方案,nice~与One-Liner相关的perl参数-a 自动分隔模式,用空格分隔$并保存在@F中,也就是@F=split //, $-...

    565ed1478e1fc3203436b392b9194a3a.png

    作为一个对shell极不熟悉的程序员,很难用到shell的一些单行命令的奇技淫巧,但是perl给出了同样容易的解决方案,nice~

    与One-Liner相关的perl参数

    -a 自动分隔模式,用空格分隔$并保存在@F中,也就是@F=split //, $
    -F 指定-a的分隔符
    -l 对输入的内容进行自动chomp,对输出的内容自动加换行符
    -n 相当于while(<>)
    -e 执行命令,也就是脚本
    -p 自动循环+输出,也就是while(<>){命令(脚本); print;}

    记住以上几点参数,几乎可以开始使用perl来编写one line命令了

    以上为简介版,下面这张图可以算是完整版

    05b8a94c06dd2b95ed23b92a91622dfb.png

    根据下面的例子来理解下perl one line

    1. 基本格式:perl -参数 '命令' 输入文件
    2. perl -e为必须要写的参数
    3. perl -pe 可用于读取文件每行,并按照给定的命令进行处理,最后输出;如将文件1.txt中的aaa替换为AAA
      perl -pe 's/aaa/AAA/g' 1.txt
    4. perl -l参数几乎可以跟n搭配代替perl经常用的while(<>){chomp;}语法
    5. 如果需要处理tab分割的文件的每一行内容,那么perl -alne参数几乎可以说是必备的,例如while(<>){chomp;@F=split /s+/,$_;print "$F[0]n"}相当于
      perl -alne 'print $F[0]'
    6. perl单行命令脚本里的变量都不需要预先声明,如想打印出每空行,并且每行以行数开头
      perl -ne 'print ++$a." $_" if /./'
    7. perl单行命令有时优于sed/grep等shell命令是由于其优秀的正则匹配,通常简单的匹配可以如:匹配上的行号,模仿grep -c的功能:
      perl -lne '$a++ if /regex/; END {print $a+0}'
    8. perl单行命令可以使用perl的模块,如使用sum函数的模块:
      perl -MList::Util=sum -alne 'print sum @F'
    9. perl也可以像awk一样使用END命令,如打印出文件中总单词个数
      perl -alne '$t += @F; END { print $t}'
    10. perl也可以使用map{}等函数,如打印出匹配上的单词的总个数
      perl -alne 'map { /regex/ && $t++ } @F; END { print $t }'
    11. perl单行命令可以说是将perl的简洁用到了极致,如打印出匹配上的行:
      perl -ne '/regex/ && print'
    12. perl单行命令能像perl一样灵活的使用则正表达式
      perl -ne 'print if /^d+$/'
    展开全文
  • perl的语法格式与C类似,注意句末添加 ;perl的变量不需要声明,直接 用$i (这点类似python)就可以windows下运行perl1.下载安装perl包: https://www.perl.org/get.html#win322.切换到目标.pl文件所在目录3.使用命令...
  • perl 匹配中文

    2012-10-30 14:10:56
    Wide character in print报错 Perl Unicode全攻略 返回vim当前中文字符编码 :echo &fenc
  • Perl匹配中文

    千次阅读 2011-05-10 18:24:00
    实际上Perl从5.6开始已经开始在内部使用 utf8编码来表示字符,也就是说对中文以及其他语言字符的处理应该是完全没有问题的。关键在于目前使用的编辑器以及文件格式并不都能很好地支持 utf8,委屈了Perl的强大能力。...
  • 根据上下文内容返回错误号或者错误串$” 列表分隔符$# 打印数字时默认的数字输出格式$$ Perl解释器的进程ID$% 当前输出通道的当前页号$& 与上个格式匹配的字符串$( 当前进程的组ID$) 当前进程的有效组ID$* 设置...
  • Textas follows: (1+2(123+(888)3)ddf)wwww(sdf(sdfdsf)gggg) Match: 1+2 123+ 888 3 ddf sdf sdfdsf gggg #!/usr/bin/perl usestrict; usewarnings; usere'eval'; my$str...
  • perl 匹配特殊字符

    千次阅读 2015-05-14 14:11:08
    上面三条正则表达式都隐藏着另一个陷阱。假如用户输入的是字串hello :-),就会导致严重的运行时错误。...Perl会报告正则表达式错在哪里: Unmatched ) in regex; marked by  m/(hello :-))
  • Perl 匹配IP或者数字

    千次阅读 2015-03-12 21:10:18
    x* 匹配 0 次或多次 x 字符串,但匹配可能的最少次数 x+ 匹配 1 次或多次 x 字符串,但匹配可能的最少次数 .* 匹配 0 次或一次的任何字符 .+ 匹配 1 次或多次的任何字符 {m} 匹配刚好是 m 个 的指定字符串 {m,n} ...
  • 在所有文件的第一行后添加一行.../usr/bin/perl ..... .... 在其后面添加添加一行## Copyright (c) 2011 by mcshell 效果如下 #!/usr/bin/perl ## Copyright (c) 2011 by mcshell ... ... 完成代码如下 #!/usr/...
  • 可以是1、2一直9,1表示第一个正则表达式匹配出得内容,2表示第二个正则表达式匹配错的内容。 maxdelay- 日志项中的"maxdelay"参数允许忽略日志文件中的一些旧行,以便在"maxdelay"秒内分析最新的行。 监控项配置...
  • 今天同事遇到一个问题,她写的正则表达式写的没有问题,但是在Linux环境下执行的时候就匹配失败了。我看了这个正则表达式,也没有问题,但是为什么会匹配失败了。原因就在于Linux 的grep命令使用了--color=auto这个...
  • perl 匹配, 没看懂?

    2013-01-22 11:03:01
    匹配表达式可以返回标量上下文 为 1 或 没有 匹配表达式可以返回数组上下文 此处的$count 显然是获取数组的个数。 整个的意思是获取匹配的个数 但还有以下问题: 1. 方括号把匹配表达式括起来是什么意思 ...
  • 记录一下,搞了好几天,呵呵 $str =~ s/([\x80-\xFF][\x80-\xFF])/sprintf("&#x%X;", ord decode("GBK", $1))/ego;
  • $test = "input";$parrten = "inpu"; if($test =~ /$parrten/){ ...但是因为$parrten的值是inpu而不是input,如果想要在匹配时,只匹配inpu而不是input,即当$test的值为inpu时才能打印显示出来,变量匹配应该怎么写?
  • Perl匹配之\w \s \d \b

    千次阅读 2014-04-21 14:10:08
    对于一些常用的匹配方式有时候不需要去编写复杂的匹配模式,正则表达式的\w \s \d \b与量词的组合能帮我们解决很多事情。 \w 匹配一个字母、数字或下划线字符,相当于[a-zA-Z_0-9] \s 匹配一个空字符 \d 匹配...
  • 它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。 use Encode; use Encode::CN; #可写可不写 $dat...
  • 比如一行数据 (21,0,0)(110,33,0)(117,1,2) 规律就是一对()内有3个数字,我...echo "(21,0,0)(110,33,0)(117,1,2)" | perl -ne 'print "$1\n" if /\((\d+)/' 结果是21 我希望是 21 110 117 请教各位大牛
  • ... ... aaaaaaaa 3c9bea7e6ca8e287f1d8e0080a647cf3 tkfkdgo ...其实也可以用一句就搞定perl -p -e s/([\w]{32})//sg ok4.txt,这是直接输入处理后的结果。 转载于:https://blog.51cto.com/n3tl04d/218152
  • perl智能匹配

    2019-05-06 13:06:00
    1.perl中~~为智能匹配,它能够智能地依据符号两側的操作数来确定操作。 如要推断某个元素是否存在于数组中,不使用智能匹配,程序像这样: my $x=2; my @array=(1,2,3); my $flag=0; for (@array) { if($x==$_) ...
  • Perl模式匹配

    千次阅读 2014-09-26 13:16:59
    Perl 内置的模式匹配让你能够简便高效地搜索大量的数据。不管你是在一个巨型的商业门户站点上用于扫描每日感兴趣的珍闻报道,还是在一个政府组织里用于精确地描述人口统计(或者人类基因组图),或是在一个教育组织...
  • Perl 模式匹配

    2010-01-22 00:01:00
    Perl 内置的模式匹配让你能够简便高效地搜索大量的数据。不管你是在一个巨型的商业门户站点上用于扫描每日感兴趣的珍闻报道,还是在一个政府组织里用于精确地描述人口统计(或者人类基因组图),或是在一个教育组织...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,203
精华内容 1,681
关键字:

perl匹配