免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sunzhiguolu
打印 上一主题 下一主题

正则求助 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
11 [报告]
发表于 2016-10-30 14:28 |只看该作者
104359176 发表于 2016-10-30 14:14
想建立自己的正则表达式集合,就建立一个模块,定期更新,CPAN 上有许多类似的模块。

对于目前的我来说, 建立自己的正则表达式集合 还是一个远大的目标啊.
编写一个匹配 全部 由字母和数字组成的字符串的表达式 是不是只能依靠 CPAN 上面的模块才能搞定啊???!!!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
12 [报告]
发表于 2016-10-30 14:37 |只看该作者
回复 11# sunzhiguolu

what are you talking about?
where is your example?

1. input data
2. procedure
3. output data

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
13 [报告]
发表于 2016-10-30 14:53 |只看该作者
本帖最后由 sunzhiguolu 于 2016-10-30 14:55 编辑

回复 12# jason680
#!/usr/bin/perl
use strict;
use warnings;

while (<DATA>){
    chomp;
    next if (/pattern/);
    print "$_\n"; #print string "S1trong168S6tring" only
}

__DATA__
ab1@3
0ab中
S1trong168S6tring

还请您指点, 谢谢...



论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
14 [报告]
发表于 2016-10-30 15:04 |只看该作者
回复 13# sunzhiguolu

$ perl -lane '{print if(/\d+/&&/[a-z]/i&&/^[a-z\d]+$/i)}' FILE
S1trong168S6tring

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
15 [报告]
发表于 2016-10-30 15:11 |只看该作者
回复 14# jason680
大神 还得向您请教下. 像这个匹配字母数字的问题.
是不是只能依靠程序语言本身的功能才能完成 利用正则表达式匹配的结果来判断的话 是不是超出了正则表达式的能力范围了?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
16 [报告]
发表于 2016-10-30 15:17 |只看该作者
回复 15# sunzhiguolu

是你不会问问题....

依你的举例,/^[a-z\d]+/i 也是可以

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
17 [报告]
发表于 2016-10-30 15:27 |只看该作者
本帖最后由 sunzhiguolu 于 2016-10-30 15:50 编辑

回复 16# jason680
if(/\d+/&&/[a-z]/i&&/^[a-z\d]+$/i)

我的确漏掉了如 全数字或者全字母的情形, 但是什么样的问题能够逃得出这三个条件判断?
如果将测试数据加上全数字或者全字母的情况, 在不依赖程序语言本身的功能 正则表达式还能够完成匹配任务吗?
我重新列举测试数据, 如下:
ab@3
0ab中
12324
sadfsd
S1trong168S6tring

输出结果依然是 "S1trong168S6tring". 谢谢您指点.

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
18 [报告]
发表于 2016-10-30 15:50 |只看该作者
本帖最后由 jason680 于 2016-10-30 16:00 编辑

回复 17# sunzhiguolu

会举例,差不多就解题...

A = abcd...
N = 0,1,2,3,...

Number start

1. NA
2. NAN
3. NANA
4. NANAN
5. NANANA
...
N. NANANAN....X   (X=N or A)

Pattern = NA(N|A)*

String start
1. AN
2. ANA
3. ANAN
4. ANANA
5. ANANAN
...
N. ANANAN....X   (X=N or A)

Pattern = AN(A|N)*


$ perl -lane '{print if(/\d+/&&/[a-z]/i&&/^[a-z\d]+$/i)}' FILE
S1trong168S6tring
a3
2b
a33
a33B
3bB1
3aA

$ perl -lane '{$A=qr/[a-z]+/i;$N=qr/\d+/;print if(/^($A$N($A|$N)*|$N$A($A|$N)*)$/)}' FILE
S1trong168S6tring
a3
2b
a33
a33B
3bB1
3aA

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 超级给力!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
19 [报告]
发表于 2016-10-30 16:00 |只看该作者
回复 18# jason680
大神 我现在才发现我的正则还是没有入门啊! 谢谢大神指点.

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
20 [报告]
发表于 2016-10-30 16:21 |只看该作者
这个问题难点在于如何确保整个字符串必须包含字母字符和数字字符两者.
观看字符串的结构才发现:
每种字符串的构成无非两种: (只说全部由字母数字组成的字符串)
1.> 以字母开始的字符串, 后面至少跟有一个数字 通过量词 '*' 重复一个分组 (\d+|[a-z]+)*, 如果这个模式能够匹配成功 并且到达字符串的结束位置 那么就萌萌哒!
2.> 以数字开始的字符串, 后面至少跟有一个字母 通过量词 '*' 重复一个分组 (\d+|[a-z]+)*, 如果这个模式能够匹配成功 且后面的 '$' 能够匹配成功, 依然萌萌哒!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP