免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1983 | 回复: 9

正则大白话问题 [复制链接]

论坛徽章:
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
发表于 2016-11-25 17:45 |显示全部楼层
看了篇帖子, 内容如下:
1
2
3

4
5
6

7
8
9
代码如下:
  1. local $/ = undef;
  2. $_ = <>;
  3. s{^((?:\S\n)+)\s*$}{$1=~s/\n//gr}gem;
复制代码

我想向大家请教的不是正则表达式如何进行编写的问题, 而是想了解下正则引擎对已经匹配到的文本 如何进行替换的问题.
我的个人感觉好像是当满足一次匹配后就执行一次替换操作, 但想想又好像不是这样.
我非常喜欢正则表达式, 就是总入不了门. 如果哪位大神有时间的话, 用白话的方式给稍微解释下, 装配下脑袋, 涨涨见识 希望各位大神指点指点.
最后, 谢谢大家帮忙了.


求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2016-11-25 18:52 |显示全部楼层
你理解的没错,确实是匹配到一段字符,就会执行替换操作。
正则表达式适合处理简单规则的文本,如果文本规则复杂,例如是一段代码,正则表达式的复杂度就会急剧上升。

通常匹配文本和修改文本是截然不同的两件事,但是由于正则表达式不能将匹配到的文本片段按照原本的结构保存为一个数据结构,就不得不在匹配的同时,还要进行替换,这让已经很复杂的正则表达式更加复杂,难以理解。

你如果对正则表达式感兴趣,就仔细阅读 Perl6 的 Grammar, 这是正则表达式的升级版,适合处理复杂的文本结构。

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 赞一个!

查看全部评分

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2016-11-25 20:51 |显示全部楼层
有本书叫做《精通正则表达式》

论坛徽章:
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
发表于 2016-11-25 22:21 |显示全部楼层
本帖最后由 sunzhiguolu 于 2016-11-25 22:31 编辑
zhlong8 发表于 2016-11-25 20:51
有本书叫做《精通正则表达式》

我现在正在学习 Perl 入门第 6 版, 版主大神推荐的这本书是不是太难了. 我并不是抵触看书, 书上的东西太枯燥了 理解的也相当费劲.
不像用实际的例子 来的痛快, 学习起来也会精神抖擞. 只可惜 正则这个东西 好像只能用作特定环境, 取巧之类的操作. 跟大神们学的东西还没等学会
忘得都差不多了. 我会抓紧时间把 perl 入门学习完, 有问题再请教大神.

另外, 版主大神 还记得我什么时间来 Perl 版报道的吗? 是谁为我解答的第一个问题吗?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2016-11-25 22:56 |显示全部楼层
回复 4# sunzhiguolu

你来 Perl 版有一年了啊,怎么这个入门书还没看完?

正则表达式那本看到你看不下去就行了,难度比较大还要跟实践结合,一两次就能全看完是不可能的。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2016-11-26 11:24 |显示全部楼层
正则表达式是一种描述文本规则的语言,使用这种语言,可以匹配文本,符合规则的文本返回真,不符合的返回假。Larray Wall 说,日常90%的工作都是在处理文本,所以匹配文本的正则表达式用途是很广泛的。

但是正则表达式不是一种完整的语言,因为他缺少“函数”调用,所以《精通正则表达式》上说,正则表达式不能描述自己。

而 grammar, 是一种完整的描述文本规则的语言,因为他能自我描述。

我们处理文本,匹配只是第一步,还要将符合条件的文本片段提取出来,然后对这些片段进行另外的处理,最后把这些片段连接起来,生成新的文本。

而处理的顺序也是文本重要的信息之一,所以按照顺序提取片段也是很重要的一步,而对于嵌套结构,这个顺序就更加重要,也是最复杂的地方。

如果想真正了解正则表达式想要做的事情,就写一个简单的正则表达式解释器,亲自尝尝,才会知道真正的味道。

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
发表于 2016-11-26 12:39 |显示全部楼层
正则是平面的,没有象一般程序语言那样包,类,方法,语句,表达式这样的多层次结构
简单的匹配替换正则很高效,但当文本多了以后,规则马上会变得很复杂,有可能改好了B规则但是A规则失效了   

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2016-11-26 14:33 |显示全部楼层
不要勉强一个正则表达式解决问题就行了,度就在 感觉脑子不够用了要学点正则表达式的新功能 那里。

论坛徽章:
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
发表于 2016-11-26 15:19 |显示全部楼层
回复 2# 104359176
一场没有结果的辩论
对于大神 推荐学习 perl 6 的 Grammar 表示非常感谢. (我发现大神 在好多次回帖当中提到 perl 6, 我也说下我对 perl 6的一些看法)
perl 6 这门语言因为我没有学习过, 所以没有什么发言权.
但从我的个人角度去理解的话, perl 6 的推广估计不会太理想.
perl 5 被大众所接受的原因有 4:
1.> perl 语言在起初之所以被大众所接受, 主要是因为对正则支持的比较完整
2.> 语言本身的特色就是设计为处理文本而生
3.> 功能的模块化, 语言本身比较轻量 但扩展性比较强 (比较符合当今语言的发展方向)
4.> 当正则被后来的大部分其他语言, 工具 所采纳 反而加剧了 perl 5 的普及性

perl 6 推广困难的主要原因如下:
1.> 对正则的支持的能力 已经不是 perl 语言的所独有 (一些高级特性, 应用的场景也非常的有限)
2.> 出身的实在太晚了, 这一点也可能是它致命的一点 (阵营一旦失去, 再想挽回 除非它拥有其他语言 无法超越的性能优势, 或者在某一领域没有它的参与根本无法完成自己手头的工作)
3.> 对于正则来说, 如果说 正则是 perl 5 能够让世人所熟知的话; 那么 perl 6 的正则 升级版 恰恰是它推广受到阻挠的主要原因之一
     3.1) 所谓升级 从广义上来说就是功能的增强 去除原有的一些糟粕; 但是也同时意味着其中一些语法在原有的基础上发生翻天覆地的变化
     3.2) 再来说一下当下, 从目前来看 众多的语言, 工具软件 对正则的支持 都停留在 perl 5 时代, 可能在语言或工具本身添加了一些自身的特性. 但总的来说变化不大, 通用性相比 perl 6 来讲还是具有得天独厚的优势
4.> 对于想学习编程的新手来说, perl 6 的推广更是雪上加霜
      4.1) 在国内来说, perl 6 根本谈不上主流, 对于一个非主流的语言 发展前景可知一二
      4.2) 众所周知, 一门语言, 工具要想得到普及 首先一点 就是提供一个能够学习交流的场所 (对于 高手来说这一点并不是重点, 但是语言或工具 自身所带来的价值与学习的投入成本是否成正比 毕竟学习一门语言不光是为了该语言非常简洁, 代码非常 cool)
             通过学习他人解决问题时如何进行编码, 从中找到自身存在的问题 才能在自身的基础上进步 否则, 没有否则

感觉离我的主题有点远了, 但这的确是我对于 perl 6 的一些看法. 我只是菜鸟, 观点有误的地方 还请各位大神指正.



论坛徽章:
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
发表于 2016-11-26 15:30 |显示全部楼层
哪位大神如果学习过 perl 6 或者说对于 perl 6的正则有所了解的话, 说一下 perl 6 中对于正则都有哪些变化, 特性, 亮点.
对于我来说, 就是想开开眼界, 涨涨见识 仅此而已. 谢谢大家!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP