perl正则表达式

    xiaoxiao2021-08-24  105

      默认情况下,m//运算符尝试匹配指定的模式和$_中的文本。 例如:在用户输入的文本中查找字符串exit(第二个反斜线之后的i修饰符是的模式匹配不区分大小写)。如果在$_中找到exit,则m//返回真;

    print"\n---------------------------(m//) Demo------------------------\n"; print "Enter:"; while(<>){ if(m/exit/i){exit;} }

     

    =~:运算符指定m//运算符查找的字符串。在这里,指定运算符应该查找标量$line,而不是$_。这段代码没有改变$line的值:

    print"\n---------------------------(m//) and(=~)Demo------------------------\n"; print "Enter:"; while($line=<>){ if($line=~m/exit/i){exit;} }

     

    !~:运算符对=~的返回值取反。

    print"\n---------------------------(m//) and(=~) (!)Demo------------------------\n"; print "Enter:"; while($line=<>){ if(!($line=~m/exit/i)){exit;} }

     

    m//运算符使用频繁,可以忽略掉m部分,多数程序使用如下快捷方式:

    print "\n---------------------------(m//)and(=~) (!) Demo------------------------\n"; print "Enter:"; while($line=<>){ if($line=~/exit/i){exit;} }

     

    与其他perl运算符一样,如果你不喜欢斜线,可以使用自己的定界符,在这种情况下必须使用m;

     

    print"\n---------------------------User Defined LimiteNotation------------------------\n"; print "Enter:"; while($line=<>){ if($line=~ m{exit}i){exit;} }

    PS:在标量上下文中,m//返回真或者假;在表的上下文中,如果使用“g”修饰符来进行全局查找,则m//返回所有匹配值的列表。

    例如,创建一个数组@a,它将容纳$_中的所有小写单词;

    print"\n-----Use 'g ' to find list match value------\n"; $_="Hereis the text"; @a=m/\b[^A-Z]+\b/g; print"@a"; print"\n-----END------\n";

    对上面子程序解析如下:

    \b:匹配单词范围

    [^A-Z]:匹配除了大写字母以外的任何字符;

    +:确保可以找到多个匹配值;

    g修饰符:说明是全局查找,全局查找可以查找所有连续的匹配值。

     s///运算符可以用一个字符串替换另一个字符串。

     例如:用字符串old替换了字符串young

    print"\n--------------------------(s///)USED-----------------------------\n"; $text_young="Prettyyoung."; print"$text_young\n"; $text_young=~s/young/old/; print"$text_young\n"; print"\n------------------------END (s///)USED---------------------------\n";

    PS:m//和s///是从左边开始匹配。

    ----------------------------------------------------tr///运算符--------------------------------------------------------------

    $text="His name is Tom."; $text=~tr/o/j/; print $text."\n"; print"\n------------------------END (tr///)USED---------------------------\n";

     

    正则表达式:\b([A-Za-z]+)\b在文本字符串中匹配单词:

    print "\n--------------------------(\b([A-Za-z]+)\b)USED-----------------------------\n"; $text="Prettyyoung."; print"$text_young\n"; $text=~/\b([A-Za-z]+)\b/; print"$1\n"; print"\n------------------------END (\b([A-Za-z]+)\b)USED---------------------------\n";

    例子解析:

    表达式(\b([A-Za-z]+)\b)包含分组元字符、\b边界元字符和字符类[A-Za-z](匹配所有的大写和小写字母)和量词+,它指定在已指定的字符类中查找一个或多个字符。

    perl记住一个匹配,前面的代码称之为$1,并打印字符串中的第一个单词。

     

    在正则表达式中,任何单个字符都与自身匹配,除非它是具有特殊含义的元字符(例如$和^)

     

    print"\n--------------------------('$ and ^')USED-----------------------------\n"; while(<>){ if(m/^exit$/i){ {exit;} }} print "\n------------------------END ('$and ^') USED---------------------------\n";

     

    perl中特殊字符:

     \077-------------8进制字符

     \a-------------报警(铃声)

     \c[-------------控制字符

     \D-------------匹配非数字字符

     \d-------------匹配数字字符

     \E-------------启用模式元字符

     \e-------------转义

     \f-------------换页

     \L-------------小写,直至遇到\E

     \l-------------小写下一个字符

     \n-------------换行

     \Q-------------引用(禁止)模式元字符,直至遇到\E

     \r-------------回车

     \S-------------匹配非空白字符

     \s-------------匹配空白字符

     \t-------------制表位

     \U-------------大写,直至遇到\E

     \u-------------大写下一个字符

     \W-------------匹配非单词字符

     \w-------------匹配一个单词字符(字母数字字符和“_”)

     \xl-------------16进制字符

     

    PS:\w仅匹配一个字母数字字符,而不是单词,为了匹配单词,需要这样使用\w+(匹配一个或多个):

    print"\n--------------------------(\w+)USED-----------------------------\n"; $text="Prettyyoung."; print"$text_young\n"; $text=~s/\w+/There/; print"$text\n"; print"\n------------------------END (\w+)USED---------------------------\n";

     

    匹配任何字符:‘.’。这个字符可以匹配任意字符,但换行符除外(但是如果与m//和s///一起使用s字符修饰符,句点字符和换行匹配)

    用*替换字符串中的所有字符,g修饰符可以使替换操作在全局范围内进行。

    print"\n--------------------------(.)USED-----------------------------\n"; $text="Prettyyoung."; print"$text\n"; $text=~s/./*/g; print"$text\n"; print"\n------------------------END (.)USED---------------------------\n";

     

    诸如句点这样的字符在正则表达式中称为元字符(元字符包括:\|()[{^$*+?.),仅需在它们前面加入反斜线,就可以确保按照字面意义解释,而不是作为元字符解释。

    ‘^’:匹配行首,让用户知道不应该用句点开始的句子。

    print"\n--------------------------(^)USED-----------------------------\n"; $text=".Prettyyoung."; print"$text\n"; if($text=~m/^\./){ print"Should't start a sentence with a period!"; } print"\n------------------------END (^)USED---------------------------\n";

     

    从C代码中删除注释,方法是通过使用*量词和.来代表任意数量的类似字符,以匹配定界符/*和*/之间的所有字符。

    print"\n--------------------------(* and .)USED-----------------------------\n"; $text="count++;/*Increment count*/"; $text=~s/\/\*.*\*\///g;

    或者使用

    $text=~s|\/\*.*\*\/||g; print $text; print"\n------------------------END (* and .)USED---------------------------\n";

     

    可以使用多个字符组成字符类,而那个类将匹配其中的任意字符。字符类要包含在[字符类]中。也可以使用-字符指定字符范围

    print"\n--------------------------([zi fu yuan zu ])USED-----------------------------\n"; $text="count++;/*Increment count*/"; if($text=~/[couIite]/){ print"Yep,we got vowels.\n"; } print"\n------------------------END ([zi fu yuan zu ])USED---------------------------\n";

    如果使用^作为字符类中的第一个字符,则那个字符类将匹配其中没有的任何字符,在下面的例子,仅匹配了既不是字母也不是空白的字符:

    print"\n--------------------------([^A-Za-z\s]+)USED-----------------------------\n"; $text="count200 Increment 000 count "; $text=~s/[^A-Za-z\s]+/521/; print $text; print"\n------------------------END ([^A-Za-z\s]+)USED---------------------------\n";

     

    提取$_中的全部小写的单词,并将它们存储在新数组@a中:

    print"\n--------------------------(\b[^A-Z]+\b)USED-----------------------------\n"; $_="Hereis the text"; @a=~m/\b[^A-Z]+\b/g; print @a; print"\n--------------------------end (\b[^A-Z]+\b) USED-----------------------------\n";

    PS:使用\b匹配单词边界

    通过将特定字符或者字符序列作为正则表达式中的文字或者字符类,就可以匹配特定字符或者字符序列。

    多重匹配模式:可以为模式指定一系列的选项,并用|分开个选项。例如,可以这样检查用户输入是否为"exit","quit","stop"

     

    print "\n--------------------------(|)USED-----------------------------\n"; print "Enter exit|quit|stop:"; while(<>){ if(m/exit|quit|stop/){exit;} } print "\n--------------------------END(|) USED--------------------------\n"; print "\n--------------------------(|)USED-----------------------------\n"; print "Enter exit|quit|stop:"; while(<>){ if(m/^(exit|quit|stop)$/){exit;} } print "\n--------------------------END(|) USED--------------------------\n";

     

     

     

    WEL测试 认证博客专家 软件测试 性能测试 接口测试 一线的测试工作人员。喜欢专研并应用新的技术,用于提升测试效率。擅长:测试新人培训、测试进阶、接口测试、性能测试、问题定位、自动化、数据测试、渗透测试! 如果对测试感兴趣或者遇到一些难题,可以加我微信:Wel_Test,加时填好备注!
    转载请注明原文地址: https://ju.6miu.com/read-677056.html

    最新回复(0)