Shell正则表达式如何保证括号成对出现?

yanch7 2013-01-25 10:22:19
我遇到这样一个问题:要匹配7个数组,前3个数字可以用括号括起来,也可以不用。
比如:
1234567 可以
(123)4567 可以
但是括号不成对就不行。比如:
(1234567 和 123)4567 就不可以。

我写了这样一个正则表达式: /^\(?[0-9]{3}\)?[0-9]{4}/
这个表达式没办法保证括号是成对的。该如何解决这个问题呢?怎么写才能将两个括号关联起来,让它们成对出现呢?
...全文
199 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljc007 2013-01-26
  • 打赏
  • 举报
回复
引用 5 楼 fdl19881 的回复:
加上-P后,,连这样的(?'group') 和(?'-group')的语法都报错了...
把完整的代码贴出来看看 顺便说下是什么系统
fdl19881 2013-01-26
  • 打赏
  • 举报
回复
引用 6 楼 ljc007 的回复:
引用 5 楼 fdl19881 的回复:加上-P后,,连这样的(?'group') 和(?'-group')的语法都报错了... 把完整的代码贴出来看看 顺便说下是什么系统
前面说的有点问题,没考虑清楚shell对表达式的解释。。 然后又试验下,反正出错了。。版本看看吧。 ubuntu 12.10 grep (GNU grep) 2.12 试验命令:
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有所不同。
fdl19881 2013-01-25
  • 打赏
  • 举报
回复
只两种情况,使用或 '|' 表达式.. 这里用的egrep与grep -E等价
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})'
fdl19881 2013-01-25
  • 打赏
  • 举报
回复
引用 4 楼 ljc007 的回复:
引用 3 楼 fdl19881 的回复:但我试验了下,grep ,egrep好像不支持.. 给grep命令加个-P选项
加上-P后,,连这样的(?'group') 和(?'-group')的语法都报错了... 
ljc007 2013-01-25
  • 打赏
  • 举报
回复
引用 3 楼 fdl19881 的回复:
但我试验了下,grep ,egrep好像不支持..
给grep命令加个-P选项
fdl19881 2013-01-25
  • 打赏
  • 举报
回复
引用 2 楼 yanch7 的回复:
引用 1 楼 fdl19881 的回复:只两种情况,使用或 '|' 表达式.. 这里用的egrep与grep -E等价 Python code?1egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})' 例子: Python code?1echo '(123)4567' | egrep '(^\([0-9]{3}\)[0-9]{……
正则表达式本身有这方面的匹配功能: 搜索: 正则表达式 平衡组/递归匹配 这个属于正则表达式的高级特性了. 比如这篇正则表达式30分钟入门教程中最后一部分有介绍: http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html#negativelookaround 但我试验了下,grep ,egrep好像不支持..
yanch7 2013-01-25
  • 打赏
  • 举报
回复
引用 1 楼 fdl19881 的回复:
只两种情况,使用或 '|' 表达式.. 这里用的egrep与grep -E等价 Python code?1egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})' 例子: Python code?1echo '(123)4567' | egrep '(^\([0-9]{3}\)[0-9]{4})|(^[0-9]{7})' Py……
谢谢。这是个办法。我想追问下有没有某种办法,能保证前后的括号一起出现或不出现呢?以后可能遇到多重括号匹配,或者是选项太多,不能枚举的情况。

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧