23,110
社区成员
发帖
与我相关
我的任务
分享
echo '<1+3*<<3*4>><>' | grep -P "<[^<>]*(((?'Open'<)[^<>]*)+((?'-Open'>)[^<>]*)+)*(?(Open)("'?!))>'
翻译过来正则表达式是:
<[^<>]*(((?'Open'<)[^<>]*)+((?'-Open'>)[^<>]*)+)*(?(Open)(?!))>
结果:
grep: syntax error in subpattern name (missing terminator)
正则表达式使用的是:
http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#negativelookaround中的最后一个例子。
为了证明自己将shell的解释也考虑进去了。所以我写了个程序试验了下:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int i;
printf("argc = %d\n", argc);
for(i = 0 ; i< argc; i++){
puts(argv[i]);
}
return 0;
}
编译生成a.out
./a.out "<[^<>]*(((?'Open'<)[^<>]*)+((?'-Open'>)[^<>]*)+)*(?(Open)("'?!))>'
结果就是这个:
<[^<>]*(((?'Open'<)[^<>]*)+((?'-Open'>)[^<>]*)+)*(?(Open)(?!))>
应该说明了传给grep的表达式是对的。
然后为了说明这个正则表达式的正确性。我在http://regexlib.com/(A(V7UhmjYwz_UTF-HDpFZ59io3zsnSKIPPJKWigU0ZGbc-c7wJPQpHAN87Ntnelrlkh8iGpksEax-qmmWtPtol5Tga7-u2_zkWACbDv841ay2wzaibNsdDVIm4gwvJ2WXMwYqqFW4UB4XdD1Pxskg_cAT_XZDmMus15HMeCc4Pxjn7Y14arX3ZGMYEKDL-AebM0))/RETester.aspx
这个网址里输入源文:<1+3*<<3*4>><>
表达式:<[^<>]*(((?'Open'<)[^<>]*)+((?'-Open'>)[^<>]*)+)*(?(Open)(?!))>
结果:
Match $1 $2 $3 $4
<<3*4>> <3*4> <3*4 >
<>
也就是说匹配到了<<3*4>>,,那么说明表达式是正确的了。
所以请版本看看是什么地方错了。。究竟是grep -P不支持,还是输入的表达式对于grep有所不同。
egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})'
例子:
echo '(123)4567' | egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})'
echo '1234567' | egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})'
echo '(1234567' | egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})'
echo '123)4567' | egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})'