志在指尖
用双手敲打未来

perl正则表达式(实例详解)

perl正则表达式

正则表达式是一个字符串的字符界说视图的形式或多形式。在Perl的正则表达式的语法是什么,你会发现在其他正则表达式,如sed,grep和awk的支撑程序十分类似。
运用正则表达式的根本办法是运用结合的运营形式=?和!?。第一个是一个测验操作符,第二是一个赋值操作符。
匹配正则表达式-m//
替代正则表达式-s///
直译(拼写)正则表达式-tr///
在每种情况下斜线作为正则表达式(regex的),你指定的分隔符。假如你喜欢用任何其他分隔符,那么你能够替代运用斜线的方位。
匹配操作符
m//匹配操作符,用来匹配一个正则表达式字符串或语句。例如,要匹配的字符序列“foo”对标量$bar,你可能会运用这样的语句:
if($bar=~/foo/)
m//其实与相同功能的q//操作符。你能够运用任何自然匹配的字符作为分隔符表达式的组合,例如,{},m(),和m><都是有效的。
假如分隔符是斜杠,你能够从m//省略成m,但一切其他的分隔符,你必须运用m前缀。
请注意,整个匹配表达式表现出来。即=?!或?匹配操作符左面的表达式,返回true(在标量上下文)假如表达式匹配。因而,语句:
$true=($foo=~m/foo/);
将会设置$true的值为1假如$foo匹配正则表达式,否则$true为0匹配失败。
匹配在列表上下文中,返回任何分组表达式的内容。例如,从字符串中提取的小时,分钟和秒时,咱们能够运用:
my($hours,$minutes,$seconds)=($time=~m/(\d+):(\d+):(\d+)/);
匹配运算符修饰符
匹配的操作符支撑其自己的一套修饰符。/g的修饰符,使全局匹配,/i修饰符将匹配不差异大小写。这里是完整的修饰符列表:
ModifierDescriptioniMakesthematchcaseinsensitive
mSpecifiesthatifthestringhasnewlineorcarriage
returncharacters,the^and$operatorswillnow
matchagainstanewlineboundary,insteadofa
stringboundary
oEvaluatestheexpressiononlyonce
sAllowsuseof.tomatchanewlinecharacter
xAllowsyoutousewhitespaceintheexpressionforclarity
gGloballyfindsallmatches
cgAllowsthesearchtocontinueevenafteraglobalmatchfails
只匹配一次
还有一个简单的版别匹配操作符-?Pattern?操作符。这根本上是等同于m//运算符但它仅匹配一次在字符串之间的每个调用reset。
例如,能够运用此列表内的第一个和最终一个元素:
#!/usr/bin/perl
@list=qw/foodfoosballsubeofootnoteterfootcanicfootbrdige/;
foreach(@list)
{
$first=$1if?(foo.*)?;
$last=$1if/(foo.*)/;
}
print”First:$first,Last:$last\n”;
#bywww.w3cschool.cn
Thiswillproducefollowingresult
First:food,Last:footbrdige
替换操作符
替换操作符,s///确实是仅仅一个扩展,使您能够替换一些新的文本匹配的文本匹配运算符。此运算符根本形式是:
s/PATTERN/REPLACEMENT/;
PATTERN是咱们正在寻觅的正则表达式的文本。REPLACEMENT是一个规范,咱们要用来替换找到的文字与文本或正则表达式。
例如,咱们能够运用.cat.替换一切呈现的.dog。
$string=~s/dog/cat/;
别的一个比如:
#/user/bin/perl
$string=’Thecatsatonthemat’;
$string=~s/cat/dog/;
print”FinalResultis$string\n”;
Thiswillproducefollowingresult
Thedogsatonthemat
替换操作符修饰符
这里是替代操作符的一切修改的列表:
ModifierDescriptioniMakesthematchcaseinsensitive
mSpecifiesthatifthestringhasnewlineorcarriage
returncharacters,the^and$operatorswillnow
matchagainstanewlineboundary,insteadofa
stringboundary
oEvaluatestheexpressiononlyonce
sAllowsuseof.tomatchanewlinecharacter
xAllowsyoutousewhitespaceintheexpression
forclarity
gReplacesalloccurrencesofthefoundexpression
withthereplacementtext
eEvaluatesthereplacementasifitwereaPerlstatement,
andusesitsreturnvalueasthereplacementtext
转化
转化类似但不完全相同替换的原则,但不像替换,转化(翻译)不运用正则表达式查找替换值。转化操作符是:
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
翻译替换在SEARCHLIST与在REPLACEMENTLIST相应呈现的字符一切字符。例如,运用“Thecatsatonthemat.”字符串咱们现已在本章中运用:
#/user/bin/perl
$string=’Thecatsatonthemat’;
$string=~tr/a/o/;
print”$string\n”;
Thiswillproducefollowingresult
Thecotsotonthemot.
也可用于标准的Perl规模,答应你指定字符的规模,由字母或数值。要改变字符串的情况下,您能够运用以下语法在方位的uc函数。
$string=~tr/a-z/A-Z/;
转化操作符
以下是有关操作符的运算符名单
ModifierDescription
cComplementSEARCHLIST.
dDeletefoundbutunreplacedcharacters.
sSquashduplicatereplacedcharacters.
/D的修饰符删去匹配SEARCHLIST的字符,不具备相应的条目在REPLACEMENTLIST。例如:
#!/usr/bin/perl
$string=’thecatsatonthemat.’;
$string=~tr/a-z/b/d;
print”$string\n”;
Thiswillproducefollowingresult
bbb.
最终的修饰符,/s删去被替换的字符的重复序列,因而:
#!/usr/bin/perl
$string=’food’;
$string=’food’;
$string=~tr/a-z/a-z/s;
print$string;
Thiswillproducefollowingresult
fod
更杂乱的正则表达式
你不仅仅有固定的字符串匹配。事实上,你能够在任何能够运用更杂乱的正则表达式仅仅匹配。这里有一个快速的小抄:
CharacterDescription.asinglecharacter
\sawhitespacecharacter(space,tab,newline)
\Snon-whitespacecharacter#bywww.w3cschool.cn
\dadigit(0-9)
\Danon-digit
\wawordcharacter(a-z,A-Z,0-9,_)
\Wanon-wordcharacter
[aeiou]matchesasinglecharacterinthegivenset
[^aeiou]matchesasinglecharacteroutsidethegivenset
(foo|bar|baz)matchesanyofthealternativesspecified
量词能够用来指定有多少曾经的东西,你要匹配,其间“thing”是指一个原义字符,上面列出的元字符,或一组括号中的字符或元字符。
CharacterDescription*zeroormoreofthepreviousthing
+oneormoreofthepreviousthing
?zerooroneofthepreviousthing
{3}matchesexactly3ofthepreviousthing
{3,6}matchesbetween3and6ofthepreviousthing
{3,}matches3ormoreofthepreviousthing
^元字符匹配字符串的开头和$metasymbol匹配字符串的结尾。
这里有一些简单的比如
#nothinginthestring(startandendareadjacent)
/^$/
#athreedigits,eachfollowedbyawhitespace
#character(eg”345″)
/(\d\s){3}/
#matchesastringinwhichevery
#odd-numberedletterisa(eg”abacadaf”)
/(a.)+/
#stringstartswithoneormoredigits
/^\d+/
#stringthatendswithoneormoredigits
/\d+$/
让咱们看看另一个比如
#!/usr/bin/perl
$string=”CatsgoCatatonic\nWhengivenCatnip”;
($start)=($string=~/\A(.*?)/);
@lines=$string=~/^(.*?)/gm;
print”Firstword:$start\n”,”Linestarts:@lines\n”;
Thiswillproducefollowingresult
Firstword:Cats
Linestarts:CatsWhen
匹配边界
匹配任何单词边界,\w类和\W类之间的差异界说。由于\w一个字的字符,\W相反,这通常是指一个词的停止。\B断语不是一个单词边界匹配任何方位。例如:
/cat/#Matches’thecatsat’butnot’catonthemat’
/\Bcat\B/#Matches’verification’butnot’thecatonthemat’
/cat\B/#Matches’catatonic’butnot’polecat’
/\Bcat/#Matches’polecat’butnot’catatonic’
选择替代品
|字符是一样的标准或按位或在Perl。它指定一个正则表达式或组内的备用匹配。例如,以匹配表达式中的“cat”或“dog”,你可能会运用这个:
if($string=~/cat|dog/)
您能够将单个表达式的元素结合在一起,以支撑杂乱的匹配。寻觅两个人的名字,能够完成两个独立的测验,像这样:
if(($string=~/MartinBrown/)||
($string=~/SharonBrown/))
Thiscouldbewrittenasfollows
if($string=~/(Martin|Sharon)Brown/)
分组匹配
从一个视点的正则表达式看没有差异,或许前者是略微更明晰。
$string=~/(\S+)\s+(\S+)/;
and
$string=~/\S+\s+\S+/;
然而,在分组的优点是,它使咱们能够从一个正则表达式提取序列。返回一个列表的次序,在他们呈现在原来的分组。例如,在下面的片段中,咱们现已从一个字符串取出小时,分钟和秒。
my($hours,$minutes,$seconds)=($time=~m/(\d+):(\d+):(\d+)/);
除了这种直接的办法,也能够在特别的$x变量,其间x是该组内一些正则表达式匹配组。因而,咱们能够重写前面的比如如下:
$time=~m/(\d+):(\d+):(\d+)/;
my($hours,$minutes,$seconds)=($1,$2,$3);
当组用于替代表达式,$x的语法,能够用来替换文本。因而,咱们能够运用此格式化的日期字符串:
#!/usr/bin/perl
$date=’03/26/1999′;
$date=~s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print”$date”;
Thiswillproducefollowingresult
1999/03/26
运用\G断语
\G断语,让您能够持续查找从最终一个匹配产生的点。
例如,在下面的代码,咱们运用的\G,使咱们能够查找到正确的方位,然后提取一些信息,而无需创立一个更杂乱的,单一的正则表达式:
#!/usr/bin/perl
$string=”Thetimeis:12:31:02on4/12/00″;
$string=~/:\s+/g;
($time)=($string=~/\G(\d+:\d+:\d+)/);
$string=~/.+\s+/g;
($date)=($string=~m{\G(\d+/\d+/\d+)});
print”Time:$time,Date:$date\n”;
Thiswillproducefollowingresult
Time:12:31:02,Date:4/12/00
\G断语,其实仅仅元符号相当于pos函数,所以正则表达式之间的调用,您能够持续运用pos,甚至修改pos的值(因而\G)的运用pos作为一个lvalue子程序:
正则表达式中的变量
正则表达式的变量,包括$,包括匹配无论最终的分组匹配;$&,其间包括整个匹配的字符串;$`,其间包括匹配字符串前的一切;和$’,其间包括匹配的字符串后的一切。
下面的代码演示的结果:
#!/usr/bin/perl
$string=”Thefoodisinthesaladbar”;
$string=~m/foo/;
print”Before:$`\n”;
print”Matched:$&\n”;
print”After:$’\n”;
#www.w3cschool.cn
Thiscodeprintsthefollowingwhenexecuted:
Before:The
Matched:foo
After:disinthesaladbar

perl
perl正则表达式实例详解

正则表达式各语言都有自己的标准,但是根本都差不多,都是由元字符的组合来进行匹配;因为Nmap内嵌的服务与版别探测是运用的Perl正则标准,因此此篇博客记载一下Perl正则的相关内容,方便后期查阅。
二、Perl正则比如
下面的比如可能有不足之处,有些来源于博客,没有验证;
1.匹配IP地址:\d+\.\d+\.\d+\.\d+
\d:匹配一个数字字符,\d+:匹配一次或多次数字字符。
\.:运用转义字符匹配’.’。
2.匹配邮箱类似于123456@qq.com:/^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9_\-]+.[a-zA-Z]+$/
^:匹配开头
$:匹配完毕,这两个确保了这是连续的一串字符。
3.匹配数字:m/^[0-9]+$/
由^开头由$完毕确保了只含有数字,假如只要完毕$,那么abc12这种也是能够的。
可用在输入校验,校验输入的是否是数字。
4.用户输入温度(华氏温度,摄氏温度),编程进行转化
m/^([-+]?[0-9]+)([CF])$/:匹配正负整数温度。
[CF]:匹配中括号其中的一个
?:匹配前面的子表达式0次或1次
+:匹配前面的子表达式一次或多次
perl经过暂时变量$1,$2保存子表达式匹配的文本。$1保存的是数字,$2保存的是符号。
m/^([-+]?[0-9]+(?:\.[0-9]*)?)\s*([CF])$/i):添加支持小数的温度匹配
暂时变量保存的顺序与分组的开括号(在表达式中的顺序有关(从左到右);因此这个当地运用?:,代表该括号匹配的值不被暂时变量保存。
/i:代表疏忽大小写匹配,cf也匹配。
参考地址:https://segmentfault.com/a/1190000004375773(精通正则表达式(第三版))
5.匹配空白行
^$:开头之后马上完毕:空白行,不包含任何字符
\n\s*\r:
\n匹配一个换行符,等价于\x0a
\s匹配任何空白字符,包含空格制表换页
\r匹配一个回车符,等价于\x0d
6.匹配首尾空白字符:^\s*|\s*$
7.匹配版别号1.3.0等
[\d.]+
8.匹配某个字符以外的一切字符:
[^a]*表明匹配除a以外的一切字符,*代表0次或多次。
[^abc]*表明匹配除a、b、c以外的一切字符。
((?!win).)*表明匹配除单词win的其它一切字符
Windows(?!95|98|NT|2000)’能匹配”Windows3.1″中的”Windows”,但不能匹配
“Windows2000″中的”Windows”。
9.匹配数字:
^\d+(\.\d+)?
^:界说以什么开始;
\d+:表明匹配数字;
?:表明内容可选;
匹配下面的内容:
1):{“service”:”nutcracker”,”source”:”ubuntu”,”version”:”0.3.0″,
m|^\{“service”:”nutcracker”,”source”:”([^”]+)”,”version”:”([\d.]+)”,|
2):220yzwb.netESMTPMDaemon10.1.2;
m|^220[-]([-.\w]+)ESMTPMDaemon(\d[-.\w]+);
3):AMQP\x01\x01\x00\n
m|^AMQP\x01\x01\x00\x0a$|:留意回车键\n对应16进制\x0a,\r对应\x0d.
Nmapnmap-services-probe文件给出的匹配

未经允许不得转载:IT技术网站 » perl正则表达式(实例详解)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载