免费注册 查看新帖 |

Chinaunix

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

正则求助 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-28 21:10 |显示全部楼层 |倒序浏览
本帖最后由 sunzhiguolu 于 2016-10-28 21:16 编辑

看了篇帖子, 内容如下:
提取6种特征码:  数字0    数字70    汉字   字母数字混合    时间    1个或2个数字和汉字    共6种
要求: 取反 提取
数字0
z24*   0   状:   |频
5184   0   状:   |频

数字70
t23 70 | 13:57:33|
1cd 70 | 13:47:34|
1an1 70 12 1
a458 70 12 2

汉字
8h605  龙   态:
2805    龙    态:

字母数字
288yj   a8   1 17
132j    2k   1 17
5dia    x6   0 0

时间
ZBNM   11:42:47   2
l20    8:47:01   11
cma    11:52:46   1
y1000   11:11:23   2

1个或2个数字和汉字
h605 65龙  态:
=6-4.  67龙  态:
560.  8龙   态:
805   2龙   态:
上面部分根据我写的代码,可以提取出来
下面部分是不符合条件的,也就是这次我要求取反的。(请根据我写的代码修改成取反)

bq20    964313  未  62
jbb@    4285     未   61
952755sy   95120    已    53
CA20        653    0    状线
|   |   |   21:43:32
|   |   |   06:25:22


论坛徽章:
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
2 [报告]
发表于 2016-10-28 21:15 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-10-28 21:21 编辑

我的代码如下:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. binmode (STDOUT, ':encoding(utf8)');

  5. my $rgxTime = qr /(?:\d\d?)(?::\d\d?){2}/;
  6. my $rgxTimeCn = qr /7?0|(?:\d\d?)?[\x{4E00}-\x{9FA5}]++/;
  7. my $rgxAlpha = qr /(?=.*?\d)(?=.*?[a-z])[a-z\d]++/;

  8. while (<DATA>){
  9.     my $line = $_;
  10.     local $_ = (split)[1];
  11.     next if (/\A(?:$rgxTime|$rgxTimeCn|$rgxAlpha)\z/i);
  12.     print $line;
  13. }

  14. __DATA__
  15. z24*   0   状:   |频
  16. 5184   0   状:   |频
  17. t23 70 | 13:57:33|
  18. 1cd 70 | 13:47:34|
  19. 1an1 70 12 1
  20. a458 70 12 2
  21. 8h605  龙   态:
  22. 2805    龙    态:
  23. 288yj   a8   1 17
  24. 132j    2k   1 17
  25. 5dia    x6   0 0
  26. ZBNM   11:42:47   2
  27. l20    8:47:01   11
  28. cma    11:52:46   1
  29. y1000   11:11:23   2
  30. h605 65龙  态:
  31. =6-4.  67龙  态:
  32. 560.  8龙   态:
  33. 805   2龙   态:
  34. bq20    964313  未  62
  35. jbb@    4285     未   61
  36. 952755sy   95120    已    53
  37. CA20        653    0    状线
  38. |   |   |   21:43:32
  39. |   |   |   06:25:22
复制代码

我想请教下大家, 我的匹配是否满足筛选条件. 请大家指点, 谢谢大家...
另外, 也请大家给些改进的意见. 再次感谢大家...

论坛徽章:
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
3 [报告]
发表于 2016-10-30 10:22 |显示全部楼层
回复 3# 104359176
问题论述不清:根据筛选结果看,字母数字混合,实际上是以数字开始,小写字母随后的组合。
还是大神法眼, 其实我就想匹配字母数字混合的情况. (不必考虑以数字还是字母开头的问题)
不过不依靠环视, 如何匹配一行中只包含字母数字混合的字符串.


论坛徽章:
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
4 [报告]
发表于 2016-10-30 10:26 |显示全部楼层
我非常喜欢正则, 对于非常简单的情况还会匹配, 稍微有点难度表达式就不知道从哪里下手了. 还请大家指点, 谢谢大家.
其他情形不必考虑, 只考虑字符串中仅能包含字母数字的情况就好.

论坛徽章:
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
5 [报告]
发表于 2016-10-30 12:37 |显示全部楼层
回复 6# 104359176
大神 您说的都对, 可就是没有我想要的表达式. (表达式内插, 的确可以增强可读性)

论坛徽章:
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
6 [报告]
发表于 2016-10-30 14:14 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-10-30 14:21 编辑

回复 8# jason680
#  for Num + Str, ex:   a8     or   2k
my $sRE_N_S  = qr /[a-zA-Z]+\d+|\d+[a-zA-Z]+/;

大神 您的这个表达式 好像只能适用字符串中 英文字母后面紧跟至少一个数字 或者 数字后面紧跟至少一个英文字母 (不区分大小写) 而不是全部由字母数字字符组成.
如:
ab1@3
0ab中

另外, SHELL 板块中您用 awk 程序逻辑进行判断由字母数字构成的字符串就能满足我上面说的条件. 这个好像简单了点吧???




论坛徽章:
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
7 [报告]
发表于 2016-10-30 14:28 |显示全部楼层
104359176 发表于 2016-10-30 14:14
想建立自己的正则表达式集合,就建立一个模块,定期更新,CPAN 上有许多类似的模块。

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

论坛徽章:
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
8 [报告]
发表于 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

还请您指点, 谢谢...



论坛徽章:
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
9 [报告]
发表于 2016-10-30 15:11 |显示全部楼层
回复 14# 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
10 [报告]
发表于 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". 谢谢您指点.

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP