免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 28557 | 回复: 13
打印 上一主题 下一主题

perl正则表达式中使用变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-23 22:49 |只看该作者 |倒序浏览
10可用积分
  1. $test1 = ".*";
  2. $test2 = "adfasdf";
  3. print $test1;
  4. if($test2 =~ m/$test1/g)
  5. {
  6.         print "ok"."\r\n";
  7. }
复制代码
输出为ok。
我想在匹配的时候让$test1按原始字符进行解释,而不是按正则表达式中的元字符解释,应该怎么办?
  1. $test1 = "\.\*";
  2. $test2 = "adfasdf";
  3. print $test1;
  4. if($test2 =~ m/$test1/g)
  5. {
  6.         print "ok"."\r\n";
  7. }
复制代码
同样输出OK
关键的问题是,在我的程序中作为变量的$test1是不确定的,是从另一个文件中读入的,我试图使用
  1. $test1 = ".*";
  2. $test2 = "adfasdf";
  3. print $test1;
  4. $test1  =~ s/([.*\?|()])/\\$1/g;
  5. if($test2 =~ m/$test1/g)
  6. {
  7.         print "ok"."\r\n";
  8. }
复制代码
来处理,但是发现应该匹配的却没有匹配成功,清高手指点。

[ 本帖最后由 xueyan 于 2007-10-24 00:13 编辑 ]

最佳答案

论坛徽章:
0
2 [报告]
发表于 2007-10-23 22:50 |只看该作者
\Q$test1\E

论坛徽章:
0
3 [报告]
发表于 2007-10-23 23:53 |只看该作者
让$test1按原始字符进行解释,而不是按正则表达式中的元字符解释


测试1,2是一回事, 因为"\.\*"中的转义在赋值$test1时发生,  赋值结束后$test1是一回事了.
测试1, 2没有对照作用, 因为".*"匹配qr/\.\*/也匹配qr/.*/

my $str   = "a";
my $test1 = ".";
my $test2 = "\.";   # 等价"."
my $test3 = q/\./;  # 等价'\.'
my $test4 = qr/\./;

($str =~ /$test1/) ? (print "Yes\n") : (print "No\n"); # Yes
($str =~ /$test2/) ? (print "Yes\n") : (print "No\n"); # Yes
($str =~ /$test3/) ? (print "Yes\n") : (print "No\n"); # No 你要的匹配
($str =~ /$test4/) ? (print "Yes\n") : (print "No\n"); # No 也是你要的

测试3失败的原因, 就是\被保留了. 在正则替换后, $test1内容是'\.\*'也就是你需要的匹配

[ 本帖最后由 Lonki 于 2007-10-24 00:45 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-10-24 00:12 |只看该作者

回复 #2 Lonki 的帖子

我的意思是,想让它按原始字符匹配,".*"只匹配".*",不匹配任何的其他的东西。

[ 本帖最后由 xueyan 于 2007-10-24 00:17 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-10-24 00:15 |只看该作者
已在2楼补充.

[ 本帖最后由 Lonki 于 2007-10-24 00:22 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-10-24 00:18 |只看该作者

回复 #4 Lonki 的帖子

我的意思是,想让它按原始字符匹配,".*"只匹配".*",不匹配任何的其他的东西。

论坛徽章:
0
7 [报告]
发表于 2007-10-24 09:37 |只看该作者
我有个想法,通过作用域范围,可能能达到你想要的效果
用作用域是因为使匹配以后,$test1能还原,但是如果你在匹配时还要使用$test1就得去掉反斜杠,还是会有副作用
你先看看吧
  1. my $test1 = ".*";
  2. my $test2 = "adfaqsdf";
  3. print $test1,"\n";
  4. {my $test3=quotemeta($test1);    #在特殊字符前加反斜杆,$test1未改变
  5.    if($test2 =~ m/$test3/g)
  6.    {
  7.         print "ok"."\r\n";
  8.     }
  9.    print $test3,"\n";
  10. }
  11. print $test1,"\n";
复制代码

论坛徽章:
0
8 [报告]
发表于 2007-10-24 09:44 |只看该作者
这种情况应该用 index
perldoc -f index

Perl 程序员滥用正则表达式是 Perl 被人鄙视的原因之一。

论坛徽章:
0
9 [报告]
发表于 2007-10-24 09:51 |只看该作者
原帖由 放驴娃 于 2007-10-24 09:44 发表
这种情况应该用 index
perldoc -f index

Perl 程序员滥用正则表达式是 Perl 被人鄙视的原因之一。

这娃正解
能帮忙解释下2楼那个答案吗?
\Q\E那个属于什么?我没接触过

论坛徽章:
0
10 [报告]
发表于 2007-10-24 11:36 |只看该作者
\Q :引号包围(消元)直到\E前面的字符
http://www.pgsqldb.org/mwiki/index.php/PatternMatching
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP