难道没有一种能替代正则表达式的方法吗?

2016-01-08 09:29:35 +08:00
 smartdie

正则表达式三大缺点:难记,难写(容易出错),难读(基本没有可读性)。
写的时候很容易匹配出错,读别人写的表达式也非常困扰。
这个世界上有那么多编程语言,难道没人发明一种更易用的字符匹配方法吗?

2730 次点击
所在节点    正则表达式
28 条回复
gimp
2016-01-08 09:35:14 +08:00
然后你会发现为了完成类似的功能,最后又都成为了变种的正则表达式
Moker
2016-01-08 09:41:09 +08:00
https://github.com/VerbalExpressions/PHPVerbalExpressions
你是需要这个么?不过最终都和楼上所说的
xream
2016-01-08 09:46:17 +08:00
amaranthf
2016-01-08 09:46:33 +08:00
你所说的难记难写难读其实是一件事情,就是因为使用了很多无法直接理解含义的符号,如^ [] \X 等,另外就是因为使用了很多符号,那么遇到原本的符号就需要转义,会更加的难以阅读。
那么你想怎么做呢?
全部使用同一种符号,比如
^变成\not() []变成\set()?
或者……
写个(if cond case1 case2)?
反正我是想象不出什么更好的表达方式。
smartdie
2016-01-08 09:49:07 +08:00
@gimp 这点我也理解,就像所有语言,都有个进阶的概念。对于一般匹配需求,能够快速看懂并解决问题是最好的,对于更复杂深入的匹配,需要复杂的手段。而正则表达式是个很容易犯错的东西,即使我用这么久,还是偶尔匹配出错。
imn1
2016-01-08 09:56:46 +08:00
start-with:"http",no-more-than-one:"s",follow-string:"://",no-more-than-one:"www.",follow-string:"v2ex.com"……
这样好读
gimp
2016-01-08 10:01:21 +08:00
所以不到万不得已,尽量避免使用正则

这类的辅助工具也能减少出错的概率

http://tool.oschina.net/regex

http://regexper.com/#%5E%5B1-9%5D%5Cd*%5C.%5Cd*%7C0%5C.%5Cd*%5B1-9%5D%5Cd*%24
dallaslu
2016-01-08 10:02:18 +08:00
其实多花些功夫,正则表达式没有想象中的难记、难写、难读。

1. 网络上有很多常用正则表达式语句的资源,正则语法也是一小篇手册就能说清的;
2. 先不处理过多的判断逻辑,逐步完善,写起来也应该是行云流水;
3. 对正则了解得稍深入一些的话,就知道可以在表达式里面写注释、组名,甚至还有一些第三方的图形解析正则的工具,可以帮助理解正则中的复杂的业务判断逻辑。
shyling
2016-01-08 10:13:41 +08:00
不觉得正则难记难写难读啊。。
swsh007
2016-01-08 10:16:13 +08:00
没觉得啊,好用就可以了。
ethego
2016-01-08 10:21:04 +08:00
正则我觉得是最好读的,简洁明了,只要你知道它的规则,根本没有歧义
jiyinyiyong
2016-01-08 10:26:40 +08:00
听说 Perl6 重新发明了正则... 不知道有没有变好用点
shangjiyu
2016-01-08 10:56:41 +08:00
有语意化的裤
babyhome
2016-01-08 11:00:43 +08:00
说到底还是功力不够
Perry
2016-01-08 11:06:45 +08:00
如果要易懂,那么必定会 trade off 简洁性,写一个规则可能会用上几行代码。
zhouyg
2016-01-08 11:08:25 +08:00
最后发现,还是正则最方便,最简洁。
smartdie
2016-01-08 11:19:52 +08:00
@babyhome 你站在使用工具的人视角说的也没错,我是站在发明工具的人的视角探讨这件事
gamexg
2016-01-08 11:20:30 +08:00
同意 1L ,实现相同的痛能最后又会变得和正则一样复杂。
理解后正则难度也不大,就是一段时间不用就忘个差不多,又需要看手册。

配合好工具写正则、读正则都很简单。楼上有网页版的正则工具,不过我一般用 Regex Match Tracer ,国产的本地免费正则软件。
gamexg
2016-01-08 11:22:56 +08:00
slixurd
2016-01-08 11:29:56 +08:00
正则表达式本质上是一个 DFA ,想要能够描述和匹配所有的字符串,最后还是会变成正则。
语言层面能做简单的语法糖,不过其实对于已经被广泛接受的正则,并没有什么优势。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/249195

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX