ultraedit正则表达式

perl中的元字符如下:

 

^    表示一行的开头;

$     表示一行的结尾;

( )   表示一个匹配块的,可以对匹配上的块通过$1,$2...进行读取,但是无法写;$0表示这个perl文件

/     表示用来进行转义的意思,比如/n表示换行符;

|     表示perl进行匹配时的或者,逻辑rank比较低;

@   表示一个数组的值;

[     表示[]的含义;

{    表示{}整个模式的含义;

?    表示前面字符出现1次或者0次;

.     表示任意字符,除了/n换行符,如果加上/s进行修饰,则/n都能被匹配;

+    表示前面字符至少出现一次;

*    表示前面字符至少出现0次;


一、简介
二、匹配操作符
三、模式中的特殊字符
1、字符
2、字符 []和[^]
3、字符 +,*和?
4、转义字符
5、匹配任意字母或数字
6、锚模式
7、模式中的变量替换
8、字符范围转义前缀
9、匹配任意字符
10、匹配指定数目的字符
11、指定选项
12、模式的部分重用
13、转义和特定字符的执行次序
14、指定模式定界符
15、模式次序变量
四、模式匹配选项
1、匹配所有可能的模式(g选项)
2、忽略大小写(i选项)例
3、将字符串看作多行(m选项)
4、只执行一次变量替换例
5、将字符串看作单行例
6、在模式中忽略空格
五、替换操作符
六、翻译操作符
七、扩展模式匹配
1、不存贮括号内的匹配内容
2、内嵌模式选项
3、肯定的和否定的预见匹配
4、模式注释
八、 注意贪婪性

九、正则表达式的返回值

一、简介

模式指在字符串中寻找的特定序列的字符,由反斜线包含:/def/即模式def。其用法如结合函数split将字符串用某模式分成多个单词:@array = split(/ /, $line);

 

二、匹配操作

匹配操作符 =~、!~
=~检验匹配是否成功:$result = $var =~ /abc/;若在该字符串中找到了该模式,则返回非零值,即true,不匹配则返回0,即false。!~则相反。

这两个操作符适于条件控制中,如:
if ($question =~ /please/) {
print ("Thank you for being polite!\n");
}
else {
print ("That was not very polite!\n");

}

 

三、模式中的特殊字符
PERL在模式中支持一些特殊字符,可以起到一些特殊的作用。
1、字符
意味着一个或多个相同的字符,如:/de f/指def、deef、deeeeef等。它尽量匹配尽可能多的相同字符,如/ab /在字符串abbc中匹配的将是abb,而不是ab。
当一行中各单词间的空格多于一个时,可以如下分割:
@array = split (/ /, $line);

注:split函数每次遇到分割模式,总是开始一个新单词,因此若$line以空格打头,则@array的第一个元素即为空元素。但其可以区分是否真有单词,如若$line中只有空格,则@array则为空数组。且上例中TAB字符被当作一个单词。注意修正。

 

2、字符 []和[^]

[]意味着匹配一组字符中的一个,如/a[0123456789]c/将匹配a加数字加c的字符串。与 联合使用例:/d[eE] f/匹配def、dEf、deef、dEdf、dEEEeeeEef等。^表示除其之外的所有字符,如:/d[^deE]f/匹配d加非e字符加f的字符 串。

 

3、字符 *和?

它们与 类似,区别在于*匹配0个、1个或多个相同字符,?匹配0个或1个该字符,+告诉引擎匹配前导字符1次或多次。如/de*f/匹配df、def、deeeef等;/de?f/匹配df或def。

 

4、转义字符

如果你想在模式中包含通常被看作特殊意义的字符,须在其前加斜线"\"。如:/\* /中\*即表示字符*,而不是上面提到的一个或多个字符的含义。斜线的表示为/\\/。在PERL5中可用字符对\Q和\E来转义。

 

5、匹配任意字母或数字

上面提到模式/a[0123456789]c/匹配字母a加任意数字加c的字符串,另一种表示方法为:/a[0-9]c/,类似的,[a-z]表示任意小写字母,[A-Z]表示任意大写字母。任意大小写字母、数字的表示方法为:/[0-9a-zA-Z]/。

 

6、锚模式
锚 描述
^ 或 \A 仅匹配串首
$ 或 \Z 仅匹配串尾
\b 匹配单词边界
\B 单词内部匹配

例1:/^def/只匹配以def打头的字符串,/$def/只匹配以def结尾的字符串,结合起来的/^def$/只匹配字符串def(?)。\A和\Z在多行匹配时与^和$不同。
例2:检验变量名的类型:
if ($varname =~ /^\$[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal scalar variable\n");
} elsif ($varname =~ /^@[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal array variable\n");
} elsif ($varname =~ /^[A-Za-z][_0-9a-zA-Z]*$/) {
print ("$varname is a legal file variable\n");
} else {
print ("I dont understand what $varname is.\n");
}
例3:\b在单词边界匹配:/\bdef/匹配def和defghi等以def打头的单词,但不匹配abcdef。/def\b/匹配def和 abcdef等以def结尾的单词,但不匹配defghi,/\bdef\b/只匹配字符串def。注意:/\bdef/可匹配$defghi,因为$并 不被看作是单词的部分。

例4:\B在单词内部匹配:/\Bdef/匹配abcdef等,但不匹配def;/def\B/匹配defghi等;/\Bdef\B/匹配cdefg、abcdefghi等,但不匹配def,defghi,abcdef。

 

7、模式中的变量替换
将句子分成单词:
$pattern = "[\\t ] ";

@words = split(/$pattern/, $line);

 

8、字符范围转义
E 转义字符 描述 范围
\d 任意数字 [0-9]
\D 除数字外的任意字符 [^0-9]
\w 任意单词字符 [_0-9a-zA-Z]
\W 任意非单词字符 [^_0-9a-zA-Z]
\s 空白 [ \r\t\n\f]
\S 非空白 [^ \r\t\n\f]

例:/[\da-z]/匹配任意数字或小写字母。

 

9、匹配任意字符

字符"."匹配除换行外的所有字符,通常与*合用。

 

10、匹配指定数目的字符

字符对{}指定所匹配字符的出现次数。如:/de{1,3}f/匹配def,deef和deeef;/de{3}f/匹配deeef;/de{3,}f/匹配不少于3个e在d和f之间;/de{0,3}f/匹配不多于3个e在d和f之间。

 

11、指定选项
字符"|"指定两个或多个选择来匹配模式。如:/def|ghi/匹配def或ghi。
例:检验数字表示合法性
if ($number =~ /^-?\d $|^-?0[xX][\da-fa-F] $/) {
print ("$number is a legal integer.\n");
} else {
print ("$number is not a legal integer.\n");
}

其中 ^-?\d $ 匹配十进制数字,^-?0[xX][\da-fa-F] $ 匹配十六进制数字。

 

12、模式的部分重用
当模式中匹配相同的部分出现多次时,可用括号括起来,后面用\n来多次引用,以简化表达式:
/\d{2}([\W])\d{2}\1\d{2}/ 匹配:
12-05-92
26.11.87
07 04 92等
注意:/\d{2}([\W])\d{2}\1\d{2}/ 不同于/(\d{2})([\W])\1\2\1/ ,后者只匹配形如17-17-17的字符串,而不匹配17-05-91等。
在/\d{2}([\W])\d{2}\1\d{2}/中,\1代表([\W]), 而在/(\d{2})([\W])\1\2\1/中,\1代表(\d{2}),\2代表([\W])。


13、转义和特定字符的执行次序
象操作符一样,转义和特定字符也有执行次序:

特殊字符 描述
() 模式内存 ,可以在后面使用\n来使用。
* ? {} 出现次数
^ $ \b \B 锚
| 选项

14、指定模式定界符
缺省的,模式定界符为反斜线/,但其可用字母m自行指定,如:
m!/u/jqpublic/perl/prog1! 等价于/\/u\/jqpublic\/perl\/prog1/

注:当用字母作为定界符时,不做变量替换;当用特殊字符作为定界符时,其转义功能或特殊功能即不能使用。

 

15、模式次序变量
在模式匹配后调用重用部分的结果可用变量$n,全部的结果用变量$&。
$string = "This string contains the number 25.11.";
$string =~ /-?(\d )\.?(\d )/; # 匹配结果为25.11
$integerpart = $1; # now $integerpart = 25
$decimalpart = $2; # now $decimalpart = 11

$totalpart = $&; # now totalpart = 25.11

实例:

$lastLabel =~ /$LabelLetter((\d\d\d)(\.\d\d\d)?)([a-z]?)/i
# Ex: for 031.100A
# $1 = 031.100, $2 = 031, $3 = .100, $4 = A

 

四、模式匹配选项
选项 描述
g 匹配所有可能的模式
i 忽略大小写
m 将串视为多行
o 只赋值一次
s 将串视为单行
x 忽略模式中的空白

1、匹配所有可能的模式(g选项)
@matches = "balata" =~ /.a/g; # now @matches = ("ba", "la", "ta")
匹配的循环:
while ("balata" =~ /.a/g) {
$match = $&;
print ("$match\n");
}
结果为:
ba
la
ta
当使用了选项g时,可用函数pos来控制下次匹配的偏移:
$offset = pos($string);

pos($string) = $newoffset;

 

2、忽略大小写(i选项)例

/de/i 匹配de,dE,De和DE。

 

3、将字符串看作多行(m选项)

在此情况下,^符号匹配字符串的起始或新的一行的起始;$符号匹配任意行的末尾。

 

4、只执行一次变量替换例
$var = 1;
$line = ;
while ($var < 10) {
$result = $line =~ /$var/o;
$line = ;
$var ;
}

每次均匹配/1/。

 

5、将字符串看作单行例

/a.*bc/s匹配字符串axxxxx \nxxxxbc,但/a.*bc/则不匹配该字符串。

 

6、在模式中忽略空格

/\d{2} ([\W]) \d{2} \1 \d{2}/x等价于/\d{2}([\W])\d{2}\1\d{2}/。

 

五、替换操作符
语法为s/pattern/replacement/,其效果为将字符串中与pattern匹配的部分换成replacement。如:
$string = "abc123def";
$string =~ s/123/456/; # now $string = "abc456def";
在替换部分可使用模式次序变量$n,如s/(\d )/[$1]/,但在替换部分不支持模式的特殊字符,如{},*, 等,如s/abc/[def]/将把abc替换为[def]。
替换操作符的选项如下表:
选项 描述
g 改变模式中的所有匹配
i 忽略模式中的大小写
e 替换字符串作为表达式
m 将待匹配串视为多行
o 仅赋值一次
s 将待匹配串视为单行
x 忽略模式中的空白

注:e选项把替换部分的字符串看作表达式,在替换之前先计算其值,如:
$string = "0abc1";

$string =~ s/[a-zA-Z] /$& x 2/e; # now $string = "0abcabc1"

 

六、翻译操作符
这是另一种替换方式,语法如:tr/string1/string2/。同样,string2为替换部分,但其效果是把string1中的第一个字符替换 为string2中的第一个字符,把string1中的第二个字符替换为string2中的第二个字符,依此类推。如:
$string = "abcdefghicba";
$string =~ tr/abc/def/; # now string = "defdefghifed"
当string1比string2长时,其多余字符替换为string2的最后一个字符;当string1中同一个字符出现多次时,将使用第一个替换字符。
翻译操作符的选项如下:

选项 描述
c 翻译所有未指定字符
d 删除所有指定字符
s 把多个相同的输出字符缩成一个

如$string =~ tr/\d/ /c;把所有非数字字符替换为空格。$string =~ tr/\t //d;删除tab和空格; $string =~ tr/0-9/ /cs;把数字间的其它字符替换为一个空格。

七、扩展模式匹配
PERL支持PERL4和标准UNIX模式匹配操作所没有的一些模式匹配能力。其语法为:(?pattern),其中c是一个字符,pattern是起作用的模式或子模式。
1、不存贮括号内的匹配内容
在PERL的模式中,括号内的子模式将存贮在内存中,此功能即取消存贮该括号内的匹配内容,如/(?:a|b|c)(d|e)f\1/中的\1表示已匹配的d或e,而不是a或b或c。
2、内嵌模式选项
通常模式选项置于其后,有四个选项:i、m、s、x可以内嵌使用,语法为:/(?option)pattern/,等价于/pattern/option。
3、肯定的和否定的预见匹配
肯定的预见匹配语法为/pattern(?=string)/,其意义为匹配后面为string的模式,相反的,(?!string)意义为匹配后面非string的模式,如:
$string = "25abc8";
$string =~ /abc(?=[0-9])/;
$matched = $&; # $&为已匹配的模式,此处为abc,而不是abc8
4、模式注释
PERL5中可以在模式中用?#来加注释,如:
if ($string =~ /(?i)[a-z]{2,3}(?# match two or three alphabetic characters)/ {
...

}

 

八、 注意贪婪性

假设你想用一个正则表达式匹配一个HTML标签。你知道输入将会是一个有效的HTML文件,因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容,就应该是一个HTML标签。

许多正则表达式的新手会首先想到用正则表达式<< <.+> >>,他们会很惊讶的发现,对于测试字符串,“This is a <EM>first</EM> test”,你可能期望会返回<EM>,然后继续进行匹配的时候,返回</EM>。

但事实是不会。正则表达式将会匹配“<EM>first</EM>”。很显然这不是我们想要的结果。原因在于“+”是贪婪的。也就是说,“+”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。

和“+”类似,“?*”的重复也是贪婪的。

用懒惰性取代贪婪性
一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。

再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“<EM”。引擎继续匹配下一个记号“>”。这次得到了一个成功匹配。引擎于是报告“<EM>”是一个成功的匹配。整个过程大致如此。


惰性扩展的一个替代方案
我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。

 

九、正则表达式的返回值
正则表达式匹配后返回的为数组或长度,取决于表达式中是否有()或者接收的变量类型

 

复制代码
$a = 'RRR3ttt';
@yy = $a=~/RRR.*ttt/;
$numofyy = $a=~/RRR.*ttt/;
print "@yy\n";
print "$numofyy\n" ;

@yy2 = $a=~/(RRR).*(ttt)/;
$numofyy2 = $a=~/(RRR).*(ttt)/;
print "@yy2\n";
print "$numofyy2\n";
print "$1 $2";
复制代码

 

结果:

1
1
RRR ttt
1
RRR ttt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微软云介绍

微软云介绍 http://msdn.microsoft.com/zh-cn/ff380142 什么是云开发&#xff1f;&#xff08;概述&#xff09; 云计算是指远程运行并通过 Internet 访问的计算机和应用程序。在云计算中&#xff0c;虚拟机在大型数据中心中运行&#xff0c;并取代了物理 PC 和服务器。通过将许…

IO端口和IO内存的区别及分别使用的函数接口

IO端口和IO内存的区别及分别使用的函数接口 每个外设都是通过读写其寄存器来控制的。外设寄存器也称为I/O端口&#xff0c;通常包括&#xff1a;控制寄存器、状态寄存器和数据寄存器三大类。根据访问外设寄存器的不同方式&#xff0c;可以把CPU分成两大类。一类CPU&#xff08…

DHCP服务开启了,为什么老是网络冲突

<b><a target"_blank" href"http://www.hnbkhb.com/ " >河南</a><a target"_blank" href"http://www.hnzzfk.com/ " >河南</a><a target"_blank" href"http://www.0371fkyy.com/ &qu…

Linux进程状态解析之R、S、D、T、Z、X

Linux进程状态解析之R、S、D、T、Z、X&#xff1b;Linux是一个多用户&#xff0c;多任务的系统&#xff0c;可以同时运&#xff1b;众所周知&#xff0c;现在的分时操作系统能够在一个CPU上运&#xff1b;在linux系统中&#xff0c;每个被运行的程序实例对应一个&#xff1b;Li…

Win8 HTML5与JS编程学习笔记(二)

近期一直受到win8应用的Grid布局困扰&#xff0c;经过了半下午加半个晚上的奋斗&#xff0c;终于是弄明白了Grid布局方法的规则。之前我是阅读的微软官方的开发教程&#xff0c;书中没有详细说明CSS3的布局规则&#xff0c;自己鼓捣了半天也是一头雾水&#xff0c;于是又找到了…

flsah的分类

1. flash按照内部存储结构不同&#xff0c;分为两种&#xff1a;nor flash和nand flash。 nor flash&#xff1a;像访问SDRAM一样&#xff0c;按照数据/地址总线直接访问, 可写的次数较少&#xff0c;速度也慢&#xff0c;由于其读时序类似于SRAM&#xff0c;读地址是线性结构&…

Oracle EXP/IMP参数详解

exp/imp是Oracle自带的导入导出命令&#xff0c;运用它&#xff0c;即使不需要那结UI工具也能轻易的完成数据导出导入工作&#xff0c;下面是它们的参数&#xff1a;EXP参数详解使用的格式是&#xff1a;EXP KEYWORDvalue 或 KEYWORD(value1,value2,...,valueN)其中USERID是必须…

java每日小算法(10)

/*【程序10】 题目&#xff1a;一球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半&#xff1b;再落下&#xff0c;求它在 第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; */ package test;public class test {public static vo…

C语言串口驱动程序

驱动层屏蔽了硬件细节&#xff0c;个人猜测&#xff0c;几乎所有移植好的系统的串口&#xff0c;都可以用一样的代码来操作&#xff0c;至少2440和树莓派是通用的。 分享代码如下&#xff1a; [cpp] view plaincopy #include <sys/types.h> #include <sys/stat.h>…

Windows下的Qt Creator的安装

采用Qt和Qt creator分别下载和安装的方式&#xff1a;&#xff08;需要手动设置关联Qt和Qt Creator&#xff09; 一、软件下载 从http://qt-project.org/downloads分别下载Qt和Qt Creator&#xff1a; Qt使用4.7.2版本&#xff1a;qt-win-opensource-4.7.2-mingw.exe Qt Creato…

进程 、进程组、会话、控制终端之间的关系

一个进程组可以包含多个进程 进程组中的这些进程之间不是孤立的&#xff0c;他们彼此之间或者存在者父子、兄弟关系&#xff0c;或者在功能有相近的联系。 那linux为什么要有进程组呢&#xff1f;其实提供进程组就是方便管理这些进程。假设要完成一个任务&#xff0c;需要同时并…

matlab保存数据

一&#xff1a;存txt文件&#xff0c;用dlmwrite()dlmwrite 将一个矩阵写到由分隔符分割的文件中。 在保存整数到文件时使用save存为ascii文件时&#xff0c;常常是文件里都是实型格式的数据&#xff08;有小数点&#xff0c;和后面很多的0&#xff0c;看着很不方便&#xff09…

linux下串口的阻塞和非阻塞操作

有两个可以进行控制串口阻塞性&#xff08;同时控制read和write&#xff09;&#xff1a;一个是在打开串口的时候&#xff0c;open函数是否带O_NDELAY&#xff1b;第二个是可以在打开串口之后通过fcntl()函数进行控制。 阻塞的定义&#xff1a; 对于read&#xff0c;block指当串…

串口初始化配置

在基于AT91的嵌入式linux中接收串口数据时&#xff0c;发现对于接收的数据经常出现接收不完整的现象。一帧的数据可能会被当做两帧接收&#xff0c;导致对于一帧数据接收出现问题。虽然这种情况在一般情况下&#xff0c;并不是经常出现&#xff0c;但是只要数据量稍微大一些&am…

Angularjs 通过asp.net web api认证登录

Angularjs 通过asp.net web api认证登录 Angularjs利用asp.net mvc提供的asp.net identity&#xff0c;membership实现居于数据库的用户名/密码的认证登录 环境 Vs.net 2013 Asp.net mvc web api Individual user accounts Angularjs Underscore 新建一个asp.net mvc web api …

PANIC: Unreachable code reached.

为什么80%的码农都做不了架构师&#xff1f;>>> Caused by: java.lang.RuntimeException: PANIC: Unreachable code reached.at cryptix.jce.provider.cipher.BlockCipher.engineGetParameters(BlockCipher.java:244)at javax.crypto.Cipher.checkCryptoPerm(Ciphe…

Linux VTIME VMIN的作用以及使用有效的前提

前提条件 1、fdcom open(ptty, O_RDWR | O_NOCTTY); //other attributions default /*Canonical Input*/ //termios_new.c_lflag | (ICANON | ECHO | ECHOE); 2、/*Raw Input*/ //termios_new.c_lflag & ~(ICANON | ECHO | ECHOE | ISIG); 下面解释&#xff1a; op…

php中使用httpclient

下载HttpClient.phphttp://yunpan.cn/QiD93DMb6vsEH &#xff08;提取码&#xff1a;ec47&#xff09; 下载之后&#xff0c;将该文件放到项目文件目录下新建class目录下 然后在php中使用: 1 <?php2 require_once class/HttpClient.php;3 $params array(4 coords>114.3…

Hi3520d uboot uImage rootfs 移植与升级

安装、升级hi3520DDEMO板开发开发环境 # 如果您使用的hi3520D的DEMO板&#xff0c;可以按照以下步骤烧写u-boot&#xff0c;内核以及文件系统&#xff0c;以下步骤均使用网络来更新。 # 通常&#xff0c;您拿到的单板中已经有u-boot&#xff0c;如果没有的话&#xff0…

面向切面编程(转)

面向切面编程&#xff08;AOP是Aspect Oriented Program的首字母缩写&#xff09; &#xff0c;我们知道&#xff0c;面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去&#xff0c;这在软件设计中往往称为职责分配。实际上也就是说&#xff0c;让不同…