免费注册 查看新帖 |

Chinaunix

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

请帮解释一下这2个正则表达式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-19 14:22 |只看该作者 |倒序浏览
本帖最后由 spirit_12 于 2011-01-19 14:25 编辑
  1. $escape_pass =~ s/'/'\\''/g;
  2. $escape_pass =~ s|((?:'\\''){2,})|q{'"} . (q{'} x (length($1) / 4)) . q{"'}|ge; #'
复制代码
看不太懂上面的两个正则表达式。能给我讲讲么。谢谢。

第一个是把单引号,置换成【'\''】么?为什么?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-01-19 14:49 |只看该作者
第二个分隔符是 |,/g 表示全部匹配替换,/e 表示对替换成的那一部分要求值
所以匹配内容是 ((?:'\\''){2,}) 并捕获,这个RE不解释
替换成的内容是 q{'"} . (q{'} x (length($1)/4)) . q{"'} 这里只是简单的字符串连接, length $1 表示左边捕获部分的长度

论坛徽章:
0
3 [报告]
发表于 2011-01-19 14:59 |只看该作者
perl -e '$_="'abcde'";$_=~s/'/'\\''/g;print $_;' 找个例子看看就知道了。

论坛徽章:
0
4 [报告]
发表于 2011-01-19 16:19 |只看该作者
回复 3# liyangole


    非常感谢啊。就是还不明白,怎么就所有字符前面都有【/】了呢?匹配单引号的话,只有最前和最后面啊
  1. [root@example ~]# perl -e '$_="'abcde'";$_=~s/'/'\\''/g;print $_;'
  2. \a\b\c\d\e\[root@example ~]#
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-01-19 17:05 |只看该作者
回复 4# spirit_12


    是呀。哪位大哥给解释下。是不是'\\''在正则里有特殊含义

论坛徽章:
0
6 [报告]
发表于 2011-01-19 17:10 |只看该作者
perl -e '$_="'abcde'";$_=~s/'/'\\''/g;print $_;'
\a\b\c\d\e\[root@example ~]

这个后面的''没有意义,代表空;
和这个 perl -e '$_="'abcde'";$_=~s/'/'\\/g;print $_;'
\a\b\c\d\e\[root@example ~]
是等价的,表示每个字符后面加个反斜杠,不知这样理解对不?

论坛徽章:
0
7 [报告]
发表于 2011-01-19 17:11 |只看该作者
回复 6# CUN_GM


    我也发现时这样了。诡异,等待高手,解释

论坛徽章:
0
8 [报告]
发表于 2011-01-19 17:28 |只看该作者
回复  CUN_GM


    我也发现时这样了。诡异,等待高手,解释
liyangole 发表于 2011-01-19 17:11



    发现用\'代替'的话就会出现>等待输入的符号。所以我猜测这个'类似与一个指针一样的东西。读一个地址匹配一次。所以每个空地都会出现一个\

论坛徽章:
0
9 [报告]
发表于 2011-01-19 17:49 |只看该作者
$escape_pass =~ s/'/'\\''/g;

谢谢各位啊。这个我好像明白了。
就是要把 单引号替换成【\'】
如果是 ‘abcd'
那么结果就是 \'abcde\'

至于上面那个结果成这样\a\b\c\d\e\,估计是在command line 的时候敲入单双引号,解释为hard quote和soft quote吧。

不知道说的对不对。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2011-01-19 17:53 |只看该作者
本帖最后由 jason680 于 2011-01-19 17:55 编辑

$_="'abcde'";$_=~s/'/'\\''/g;print $_;
这个只能放在code(档案中)--你用太多单/双引号...

加一个set -x,你就知道错在那

# set -x; perl -e '$_="'abcde'";$_=~s/'/'\\''/g;print $_;'; set +x
+ set -x
+ perl -e '$_="abcde";$_=~s//\\/g;print $_;'
\a\b\c\d\e\+ set +x

=======================================
# cat test.pl
$_="'abcde'";$_=~s/'/'\\''/g;print $_;

# perl test.pl
'\''abcde'\''
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP