- 论坛徽章:
- 0
|
本帖最后由 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 无法完成
请高手指点一下,谢谢 |
|