免费注册 查看新帖 |

Chinaunix

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

[算法] 请教一个正则表达式的写法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-27 14:45 |只看该作者 |倒序浏览
20可用积分
要求输入框中的输入字符的条件:
1)只能有字母,数字,"."以及"/",长度5-13
2)"/"有且仅有一个,且不能是第一个以及最后一个
3)只能以字母开头


呵呵,久了不写忘了,,应该是什么/^[_a-z]+@([_a-z0-9]...不懂了

请朋友们指点。

------------------------------------------------------------------
谢谢朋友们的指点,特别是mgqw的回答,,这个正则表达式用于C++中regcomp&regexec的使用,所以想用一个pattern搞定,mgqw给出了最接近的两个pattern。
这里再请教一下各位朋友。

如果不用长度限制5-13,是不是可以用一个pattern搞定?

[ 本帖最后由 iknowabc 于 2009-11-3 11:26 编辑 ]

最佳答案

查看完整内容

不长度限制的话,可以,如下:[simtiger]$ cat data112345abcdabcd\dd\2\abcd123abcd123\abcd\123[simtiger]$ grep -E '^[[:alpha:]][[:alnum:]]*\\?[[:alnum:]]+$' data1abcd\123

论坛徽章:
0
2 [报告]
发表于 2009-10-27 14:45 |只看该作者
原帖由 iknowabc 于 2009-10-27 14:45 发表
如果不用长度限制5-13,是不是可以用一个pattern搞定?


不长度限制的话,可以,如下:

[simtiger]$ cat data1
12345abcd
abcd\dd\2
\abcd123
abcd123\
abcd\123

[simtiger]$  grep -E '^[[:alpha:]][[:alnum:]]*\\?[[:alnum:]]+$' data1
abcd\123

论坛徽章:
0
3 [报告]
发表于 2009-10-27 14:56 |只看该作者
用什么正则啊,自己写个函数判断下,十几分钟的事情

论坛徽章:
0
4 [报告]
发表于 2009-10-27 15:08 |只看该作者
bool check(const char* str){
    int len=strlen(str);
&nbsp;&nbsp;&nbsp;&nbsp;if(len<5||len>13||str[0]>'z'||str[0]<'A'||(str[0]>'Z'&&str[0]<'a')||str[len-1]=='\\')return false;
&nbsp;&nbsp;&nbsp;&nbsp;int ct=0;
&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i<len;i++){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((str[i]<='9'&&str[i]>='0')||(str[i]<='z'&&str[i]>='a')||(str[i]<='Z'&&str[i]>='A')||str[i]=='.')continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(str[i]=='\\'){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ct++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(ct!=1)return false;
&nbsp;&nbsp;&nbsp;&nbsp;return true;
}

论坛徽章:
0
5 [报告]
发表于 2009-10-27 15:16 |只看该作者
我来正面回答。

长度我不知道如何判断。

正则:
/^[a-zA-Z][a-zA-Z0-9\.]*\/[a-zA-Z0-9\.]+$/

[ 本帖最后由 naihe2010 于 2009-10-27 15:28 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-10-27 17:29 |只看该作者
shell的正则表达式? 还是c语言的sscanf正则表达式???

论坛徽章:
0
7 [报告]
发表于 2009-10-28 11:30 |只看该作者
grep使用正则表达式如下:
[mgqw@localhost Desktop]$ grep '^[[:alpha:]][[:alnum:] . /]\{3,11\}[[:alnum:] .]$' aaa
输出:
a./as1233f./a

文件aaa的内容如下(只有最后一行符合要求):

  1. as;kdjf
  2. saddfj;sakdff
  3. sdf*askdjf
  4. askddfjf;ksajdf/
  5. /sadf
  6. .asddf
  7. 5asdf
  8. a./asas1341234sadfdffa./a
  9. a./as&2*3f./a
  10. ./as1*3f./a
  11. a./as1233f./a
复制代码


没有问题的话楼主结帖给分!~

[ 本帖最后由 mgqw 于 2009-10-28 11:33 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-10-28 11:46 |只看该作者
楼上 [[:alnum:] . /]\{3,11\}

/"有且仅有一个 这个没做到。

论坛徽章:
0
9 [报告]
发表于 2009-10-28 12:04 |只看该作者
先用 strlen() 判断长度,通过后再用 naihe2010 的正则匹配

论坛徽章:
0
10 [报告]
发表于 2009-10-28 14:16 |只看该作者
原帖由 wenlq 于 2009-10-28 11:46 发表
楼上 [[:alnum:] . /]\{3,11\}

/"有且仅有一个 这个没做到。

改过来了:
[mgqw@localhost Desktop]$ grep '^[^/]*/[^/]*$' aaa  |  grep '^[[:alpha:]][[:alnum:] . /]\{3,11\}[[:alnum:] .]$'
a.asdf/33f.a



[mgqw@localhost Desktop]$ cat aaa

  1. as;kdjf
  2. saddfj;sakdff
  3. sdf*askdjf
  4. askddfjf;ksajdf/
  5. /sadf
  6. .asddf
  7. 5asdf
  8. a./asas1341234sadfdffa./a
  9. a./as&2*3f./a
  10. ./as1*3f./a
  11. a./as1233./a
  12. a.asdf/33f.a
  13. a.a/sf/33f.a
复制代码

[ 本帖最后由 mgqw 于 2009-10-28 14:33 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP