perl正则表达式perl正则表达式匹配任意字符
本文目录一览:
- 1、perl 代码中 变量 匹配变量的正则表达式的写法
- 2、perl 正则表达式/^\s*(.*?)\s*\=\s*\"(.*)\"/是什么意思?
- 3、解释下perl的正则表达式里?= ?! ?
- 4、Perl正则表达式常用语法总结
- 5、perl 正则表达式 原样输出
- 6、为什么说perl的正则表达式功能比Python强大
perl 代码中 变量 匹配变量的正则表达式的写法
说一下你的错误:@pattern是数组变量,数组变量访问的形式,要么是@pattern访问全部变量,要么利用$pattern[$i]的形式访问。你直接写$pattern是访问不到任何东西的。所以需要对@pattern再加一个循环进行正则匹配。下面是我写的perl代码,直接读取数组型字符了,为方面没有读入文件,和你说的问题应该类似。结果图也附上了,不知道和你说的是否符合。
#!/usr/bin/perl
@configfile = ("I","am","a","patten1","Not","Apatten");
@patten = ("patten1","patten2","patten3");
$i=0;
$j=0;
foreach my $line (@configfile)
{
foreach my $pad1 (@patten)
{
if ($line =~ /$pad1/){
print "\$configfile[$i]与\$patten[$j]匹配\n";
}
$j++;
}
$j=0;
$i ++;
}
perl 正则表达式/^\s*(.*?)\s*\=\s*\"(.*)\"/是什么意思?
代码没有问题。
将db.ini文件的内容逐行读出来,并进行正则匹配,将所有符合下面匹配规则的行的等号左边有效字符串(可能会为空)作为变量的名字,并将等号右边的有效字符串作为变量的值
匹配规则是,字符串必须是以至少一个空格开头,然后有或者没有除了换行符以外的任意字符串,然后再接至少一个空格,然后是=号,然后再接至少一个空格,然后是冒号”,然后是除了换行符以外的任意字符串,最后是冒号“
解释下perl的正则表达式里?= ?! ?
首先,g{n}是perl
5.10的反向引用新写法,n是想要反向引用的组号。没有g{n}写法的时候,需要用\1,\2,\3等来表示相对应的反向引用,数字代表括号出现的先后,即为“组号”。在你给出的模式中,只出现了一个括号,所以{}里应该是1,它指“引用第1个括号所匹配的内容”。你理解的可能是,因为b出现2次所以括号里应该是2,错在没理解g{n}中n的含义。另外,这个模式比较简单,其实没必要用g{},只需/a(.)\1a/即可。
Perl正则表达式常用语法总结
操作符
m/.../ 模式匹配操作符
s/.../.../ 模式替换操作符
qr/.../ 预编译正则表达式
=~ 绑定操作符
普通元字符
. 通配符,可匹配除\n外的一个任意字符
\ 用于字符转义
| 择一竖线
\Q...\E 转义\Q至\E之间的所有元字符
字符集
[...] 肯定型字符集
[^...] 否定型字符集
- 可用于表示一系列连续字符
[-...\\...\^] 字符集中表示真正的“-”、“\”与“^”
字符集简写
\d与\D 基本相当于[0-9]与[^0-9]
\w与\W 基本相当于[A-Za-z0-9_]与[^A-Za-z0-9_ ]\s与\S 空白字符集(包括空格、\n等)及其反义字符集
量词
* 可重复匹配0至任意多次
+ 可重复匹配1至任意多次
? 可重复匹配0或1次
{1,5} 通用量词,可重复匹配1至5次
{1,} 无重复匹配次数上限,此处相当于量词“+”
{5} 固定匹配5次
*?、+?、??、{...}? 忽略优先量词
*+、++、?+、{...}+ 占有优先量词
与小括号相关的语法
(...) 普通捕获组
(?: ...) 非捕获组
(? ...) 固化分组
(? ...) 命名捕获组
(?i-m: ...) 启用i修饰符并关闭m修饰符的非捕获组
((?i-m) ...) 启用i修饰符并关闭m修饰符的捕获组
\1、\2、\3 普通绝对反向引用
\name 反向引用命名捕获组
\g{...}、\k... 支持相对反向引用的写法(二者略有差别)
$1、$2、$3 使用绝对编号的捕获变量
$+{name} 通过%+散列调用命名捕获组内容
$`、$、$' 匹配前字段、匹配字段与匹配后字段(使用会大幅降低正则引擎的速度)
修饰符
/i 模式字符忽略大小写
/m 启用行首尾锚位
/x 启用宽松排列模式
/g 全局匹配、全局替换
/o 只编译一次
锚位
\A 绝对开头锚位
\Z 绝对末尾锚位
\z 忽略末尾换行符的末尾锚位
^、$ 未开启/m时,相当于\A与\z,开启\m后为行首尾锚位
\b 单词边界锚位
\B 非单词边界锚位
\G 锚位到上一次成功匹配的结束位置
(?= ...) 肯定顺序环视
(?! ...) 否定顺序环视
(?= ...) 肯定逆序环视
(?
优先级
小括号 量词 锚位和序列 择一竖线 原子
樱雨楼
完于:2016.3.30
perl 正则表达式 原样输出
1:
在字符串中,|不是特殊字符。
在正则表达式中,|是特殊字符,代表或。
都能找到是因为"abc|ppp|xxx" =~ /abc|ppp|ooo/成立。
"abcpppxxx"=~ /abc|ppp|ooo/也一样会成立的。
2:
$a="abc|ppp|ooo"中的|是保持原样没有被转义的。
在字符串中|不是特殊字符。
3:
你的写法
if(/$a/) print "B find";
完全等价于
if(/abc|ppp|ooo/) print "B find";
在正则表达式中,|是特殊字符。
4:
所以结论是,//中的字符串已经是保持原样的,并没有被转义;
而你需要的恰恰相反,是在正则表达式//中 将字符|进行转义。
有点语言游戏了……
5:
解决方法就是加入转义字符\。
程序如下:
$a="abc\\|ppp\\|ooo"; #字符串中,\是有特殊含义的,转义字符。
#更推荐的写法是这样:$a='abc\|ppp\|ooo';
#单引号中除单引号和反斜杠外所有字符都代表他本身。
$b="abc|ppp|ooo";
$c="abc|ppp|xxx";
$_=$b;
if(/$a/) print "B find"; #等价于if(/abc\|ppp\|ooo/)
$_=$c;
if(/$a/) print "C find";
6:
如果你的程序有些特殊的要求,你可以按下面的来。
程序如下:
$a="abc|ppp|ooo";
$b="abc|ppp|ooo";
$c="abc|ppp|xxx";
$aa = $a ;
$aa =~ s/\|/\\|/g;
$_=$b;
if(/$aa/) print "B find";
$_=$c;
if(/$aa/) print "C find";
注:$aa =~ s/\|/\\|/g;中的s///g是全部将|字符变换成字符\|,s///中前半部分是正则表达式,后半部分是文本字符串。
为什么说perl的正则表达式功能比Python强大
最大的分别就是.. 速度!
从各种的测试都显示, perl 的正则处理依然是最快的 (不只比 python) , 下面的实测可以去看看
https: 斜斜 stuffivelearned 点 org 斜 doku.php?id=programming%3ageneral%3aphpvspythonvsperl
其实 perl 本来就是正则的鼻祖, 它最初的开发的原意很大程度也是为了正则
至於为甚麼比 python 快其实不难想像
Perl 不是 OO 语言(虽然有 OO 的玩法), 所以用到正则时, 正接就开始跑, 不用继承一堆有的没的属性和方法. 至於 python 还要先把字串 compile 了做一个物件, 才开始做正则, 在底层自然又多了一重功夫
Python 的正则要靠模块来完成, Perl 的正则却已在 perl 解释器的心脏里, 谁会起动的更快就很明显了. 当然, 除了 C Python 还算最快之外, 其他如 JPython, Iron Python 这些要靠 framework 来起动的就必然更慢了
另外就是... 连击和助攻, perl 的正则很可以直接当成 expressiON (=~ 和 !~ ) 来用, 如:
use utf8;
$wantId = "陈大文";
die "帐号不能用奇怪字符" unless $wantId =~ /^[\w\d]+$/ ;
#或者
%user = (
1 = { Name = "王子" },
2 = { Name = "小王子" }
3 = { Name = "王妹" } );
@姓王的 = grep { $user{$_}{Name} =~ /^王/ } keys %user;
# @姓王的 = ( 1, 3)
# 又或者
%mask = ( 1 = "M", 2 = "X", 3 = "B" );
$password = "321"; #普通密码
$maskedPw = undef; #加密密码
$password =~ s/(.)/$maskPw .= $mask($1)/eg;
# maskedPw = "BXM"上面几例, 试问用 python 要写多少行才做到用样的效果呢.. 不过, 这多少语言层次的问题, 姑且另作别论了.
perl正则表达式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于perl正则表达式匹配任意字符、perl正则表达式的信息别忘了在本站进行查找喔。
相关文章
发表评论
评论列表
- 这篇文章还没有收到评论,赶紧来抢沙发吧~