免费注册 查看新帖 |

Chinaunix

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

求教高手正则表达式的扩展用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-27 15:38 |只看该作者 |倒序浏览
本帖最后由 justu78 于 2013-09-28 21:43 编辑

我想匹配一个字符串中的类似“......a = (3) b =‘2'  c="5"........ ”的定义,做循环处理,每次抓出象a = ((3)) 或者b = '2' 或者 c="5"的合法数据定义部分,而且还要能避开a=((2) 或者b=3'这些非法的,规则是:数字两边的定界符号可以是括号,单引号或者双引号,要求左边和右边的括号个数要匹配,可以没有,也可以大于1个。单引号或者双引号左右最多只能一个,字符串的最后可以有\\作为下一行的连续符,等号两边可以有若干空格,简单来说就是找到合法的参数赋值部分,现在只是简单举例数字是整数,其他类型的数据我自己可以搞定模式匹配,最后只剩下不合法或者其他的怪异部分,我做的测试代码如下:
#!/bin/sh
eval 'exec perl -S -x -w $0 ${1+"$@"}'
#!perl
$\="\n";
$,=" ";
$str=' tx = (4)  ad="6"  xyz =4)) \\';
while($str=~/^\s*(\w+\s*=\s*('|"|\(*)?\s*\d+\s*(??{if($2){if($2=~m#\(#){'\)'x length $2}else{"$2"}}}))(\s+|\s*(\\\\)?\s*$)/){
print "$1";
$str=~s/\Q$1//;
}
print "final $str";
运行结果失败,perl提示模式匹配中有变量未赋值。我的模式中利用了正则表达式的扩展用法(大骆驼书中看来的),但是使用起来不行,
我喜欢看到最后的结果是 " xyz =4)) \\"  但是perl 无法完成
请高手指点一下,谢谢

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
2 [报告]
发表于 2013-09-27 16:02 |只看该作者
多给些文本,,然后给出匹配之后的文本

论坛徽章:
0
3 [报告]
发表于 2013-09-27 16:15 |只看该作者
mcshell 发表于 2013-09-27 16:02
多给些文本,,然后给出匹配之后的文本

我上面给了一个例子了啊

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [报告]
发表于 2013-09-27 16:20 |只看该作者
回复 3# justu78


    没看懂你要说什么,直接给出你需要匹配的文本,还有特殊情况也举例出来

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2013-09-27 16:29 |只看该作者
没看懂LZ你要什么

论坛徽章:
0
6 [报告]
发表于 2013-09-27 16:52 |只看该作者
mcshell 发表于 2013-09-27 16:20
回复 3# justu78

文本
tx = (4)  ad="6"  xyz =4)) \\
第一次匹配并且从原来文本中删除
tx = (4)
第二次匹配并且从原来文本中删除
ad="6"
最后剩下
xyz =4)) \\

以上是一个简单例子,我的原文描述没人能看懂?

论坛徽章:
0
7 [报告]
发表于 2013-09-27 18:07 |只看该作者
本帖最后由 onepublic 于 2013-09-27 18:14 编辑

描述确实不太清楚,比如 等边 左边的部分只能是字母么?
类似于
=a  =  (daf) 算合法么?
a = 1 = 2,   不合法的匹配应该是哪一部分?

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
8 [报告]
发表于 2013-09-27 19:26 |只看该作者
直接找出有效的部分

/\w+\s*=\s*\d+/

论坛徽章:
0
9 [报告]
发表于 2013-09-28 11:40 |只看该作者
onepublic 发表于 2013-09-27 18:07
描述确实不太清楚,比如 等边 左边的部分只能是字母么?
类似于
=a  =  (daf) 算合法么?

我的匹配模式里写了阿,等号的左右必须是\w+,也就是字母数字下划线。很明显= a = (daf)不合法,括号内必须是数字啊,我不是说得很清楚了吗?。。。。

论坛徽章:
0
10 [报告]
发表于 2013-09-28 11:42 |只看该作者
104359176 发表于 2013-09-27 19:26
直接找出有效的部分

/\w+\s*=\s*\d+/

请认识看看我的描述好吗?虽然你的这个模式在例如 adc=3是可以成功的,但是abc =((3)) 呢abc='3' 或者abc=(3) 或abc="3"呢?我要检查的字符串中可能有很多类似的部分,有合法的,有不合法的,我需要找出合法的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP