我相信,想问这个问题的 V 友不止我一个。
1
ethanlu 2018-12-28 22:02:41 +08:00 1
正则这东西会就行了,没事不会天天写,反正学会之后就写了两个,遇到要用的时候找个正则网站试几个样本,ok 啦。
|
2
likuku 2018-12-28 22:05:11 +08:00 2
尽量不用它,实在逃不掉的话,那就在线搜,反正各种在线 正则生成器 /测试器 足够多。
想起以前某本正则的厚书的序言里提到:世上就两种人,学会正则一劳永逸;没学会正则的人 没错,我就是不会正则的人 |
3
alexmy 2018-12-28 22:16:17 +08:00
学了几次,又都忘了,最近打算写一个 golang 的工具库,包括正则的,顺带当练习下。
|
4
szzhiyang OP |
5
anguiao 2018-12-28 22:19:34 +08:00
没有特别系统地学过,不过一般碰到用正则的情况都不算特别复杂,都能写出来。
|
6
largecat 2018-12-28 22:20:51 +08:00 via Android
前前后后学了几次,每次看完就忘记了。
所以平时尽量避免使用他, 后来接触 scrapy,意外写了几个,会了, 其他的就套用了 |
8
clino 2018-12-28 22:22:45 +08:00
kodos re ide
|
9
lhx2008 2018-12-28 22:22:55 +08:00
我每次写都要看那个手册,啥正向肯定预查、正向否定预查、反向肯定预查、反向否定预查你们真的记得住吗?
|
11
ethanlu 2018-12-28 22:30:57 +08:00
@szzhiyang #10 我是看这本学的,你可以找找看,[正则表达式入门经典].(美)瓦特.扫描版。我一个不是程序员的人都能学会,练一练咯。
|
12
innoink 2018-12-28 22:31:27 +08:00 via Android
查表,测试
|
13
jingyulong 2018-12-28 22:33:42 +08:00 via iPhone
熟练就是多用。找找本书,把基础过一遍。懂得原理,写起来就得心应手了。
|
14
Coolwinds 2018-12-28 22:34:35 +08:00 7
正则是个很神奇的东西,每次复习完一段时间不用必忘
|
15
goreliu 2018-12-28 22:37:10 +08:00 via Android
会用就行,如果用得频繁自然就记住了,不然的话不管怎么记过一阵也得忘,没必要做无用功。
|
16
EricXuu 2018-12-28 22:40:38 +08:00 via Android 2
|
17
lrxiao 2018-12-28 22:41:54 +08:00
刚想说 Regex Golf (
|
18
autoxbc 2018-12-28 22:46:30 +08:00
如果说不要炫技是个公认的准则,那么不要在正则里炫技也是同样道理
|
19
amenging 2018-12-28 22:49:30 +08:00
用用就熟了,关键还是在做题或者实际项目中要用到..
|
20
Cbdy 2018-12-28 22:51:22 +08:00 via Android
你需要理解正则的原理,这样就不需要练习了
|
21
KasuganoSoras 2018-12-28 22:52:24 +08:00 via Android
不会就上 Google 找,我学了这么久也就记住了个匹配中英文,数字,特殊字符,指定长度
|
22
junjieyuanxiling 2018-12-28 23:02:44 +08:00 via Android
记住几个常用的就够了吧,有需要再找。
|
23
seki 2018-12-28 23:03:33 +08:00
需要用的时候,打开 google 和 regex101,开始不断尝试
|
24
qz357 2018-12-28 23:04:48 +08:00 via iPhone 1
推荐一个神奇 https://regex101.com
|
25
xiangyuecn 2018-12-28 23:07:29 +08:00 2
感觉一个小时学会简单正则表达式(忘不了),能解决 80%需求。剩下容易忘、难懂的了解一下就行了,像楼上说的这部分学会了也容易忘记。。
简单的: ^$ 开头结尾 *+? 吃豆人 ? 阻止吃豆 .\w\d\s 那些大写的就算了 算是取反 \b 好东西,不过好难理解 ()(?:) 分组,拒绝分组 | 或运算符? [] 难用的一币 {} 感觉挺有用,其实用的少,*+?用的多 不常用的: 剩下的都好高级的好吧,难学难写,各种环境下还不一定支持,学会了可以解决剩下的 20%需求 |
26
Navee 2018-12-28 23:24:12 +08:00
开始是准备学的,发现怎么都学不会
后来工作每天都要用,莫名其妙就会了 |
27
neptuno 2018-12-28 23:26:34 +08:00
学了就忘说明并不需要经常用到正则,等到要经常用的时候自然就会了
|
28
piokhj 2018-12-28 23:59:20 +08:00
不要学,不要记,直接用。
正则可以解决很多问题,每天都能用上。 |
29
momoplutoliu 2018-12-29 00:13:21 +08:00
程序员都有 sublime text, vscode, 各种 IDE 吧?
那不简单: - 把要处理的文本打开 - ctrl+f,选择正则匹配模式 - 查表,不断的试,编译器的高亮就是反馈 基本的.*+?()[]^$这些符号含义记清楚,我也没有专门的去针对训练, 用到的时候,自己先试,试不出来问 google,再试 |
30
wivwiv 2018-12-29 00:43:19 +08:00 via iPhone 6
程序员遇到一个问题 好像可以用正则解决?
好了,现在变成两个问题了 |
31
Greatshu 2018-12-29 01:16:00 +08:00 1
写 B 站弹幕屏蔽列表
|
32
komorebiSaw 2018-12-29 01:38:53 +08:00
会用基本的, 但原则是能不用就不用
以前见过别人 n 个文件, 每个文件几百行正则 惊为天书 |
33
Sparetire 2018-12-29 02:15:28 +08:00 via Android 1
学完编译原理,简单的正则不需要查也会写了,扩展的正则特性,用到再查查,多用几次也差不多都记住了
|
34
sola97 2018-12-29 02:22:25 +08:00 via Android
B 站弹幕屏蔽列表+1,写着多了就熟了
|
35
mario85 2018-12-29 02:50:53 +08:00 via iPhone
多玩玩 grep
|
36
Telegram 2018-12-29 03:54:45 +08:00 via iPhone
这玩意就是要用了现查现用就行了
|
37
xxgirl2 2018-12-29 04:05:39 +08:00
正则好学
关键是用到它的那几个命令的参数一直记不住 |
38
dangyuluo 2018-12-29 06:49:07 +08:00
学习正则就像是学习骑自行车一样,光看理论没什么用,需要的时候花两个小时看一下就可以了。然后另一点就是多看别人的正则是怎么写的。
|
39
tachikomachann 2018-12-29 08:07:11 +08:00 via Android
用 vim。。。
|
40
Akiyu 2018-12-29 08:25:43 +08:00
多用啊, 用着用着就会了
你想学的话有两本书可以推荐 初学者: 正则表达式必知必会 评价: 这本书很小巧, 地铁里面可以读. 如果你不关心原理, 只是想快速使用的话, 这本最合适不过了 进阶: 精通正则表达式 评价: 这本书就是比较权威的书籍了. 上面那本书的作者在引言中都推荐了这本书, 可见此书的含金量有多高 适合对正则表达式有一定理解了, 并且工作中常用到, 想进阶的人看 |
41
OldPanda 2018-12-29 08:26:57 +08:00
不练习,因为正则并没有那么常用,需要的时候就到 https://pythex.org/ 现拼一个
|
42
reself 2018-12-29 08:34:53 +08:00 via Android
学习编译原理。正则的三种基本运算是连接、选择和闭包,其他运算的可以视为语法糖了,虽然表达力有限,大部分需求没啥问题了。加一个非运算。
|
43
ctro15547 2018-12-29 08:48:00 +08:00
桌面常放 7 楼那张图,要用了拿出来看,找 Notepad++试一下,你说什么要判断要筛选条件?我都是 re 个大概然后交给 if:else:去干的。。
|
44
bumz 2018-12-29 09:10:15 +08:00
先学习形式语言与自动机相关理论
学到正则语言,ε-NFA,正则表达式就够了 然后可以自己用 DFA 实现一个严格线性时间的正则引擎,就像 re2 到这一步你就是世界上最懂正则表达式的人之一了 许多正则引擎还有一些扩展功能,比如 backtracking,backreference 之类的,这些扩展打破了正则语言的界限,原则上已经应该用 CFL 乃至 CSL 甚至 RE 的识别器了 |
45
bumz 2018-12-29 09:12:43 +08:00 1
给大家出一道题,看看你是否会写正则表达式
1) 请构造一个正则表达式,判断任意给定的数(十进制字符串)是否是 13 的倍数(如 0, 13, 26...) 2) 对于任意给定的 m (m >= 2),编写一个程序,生成一个识别 m 的倍数的数(十进制字符串)的正则表达式。 |
46
usingnamespace 2018-12-29 09:14:05 +08:00 via iPhone
@reself 呵呵呵 你们这些扯编译原理的什么鬼。本来人家就是一个问题,你这瞬间是两个问题了。国内有的计算机相关专业有的都直接不开编译原理了好吗?一方面主要是都上成了 parsing+汇编入门,汇编又学的不如微机。parsing 也就那样了,正则确实会有体现,但是人家的回答下这样说是不是没意义了
|
47
woodensail 2018-12-29 09:17:07 +08:00
正则基本上除了平衡组其他的都挺简单的,顶多是零宽断言那边符号组合容易忘,但是规则不难。
平衡组我是真搞不明白。 |
48
woodensail 2018-12-29 09:20:17 +08:00
@bumz 自动机……
|
49
mengyang624 2018-12-29 09:25:52 +08:00
我脑子里能记住的就只有一个 |
其他全部靠搜索、测试。。。 |
50
ioven 2018-12-29 09:26:18 +08:00
开始看了 30 分钟入门,知道大概可以解决什么问题
之后碰到问题现查解决方法,用的多了自然就记住了 |
51
DavidNineRoc 2018-12-29 09:28:36 +08:00
当初去爬妹子图片的时候现学的,现在还忘不了。你可以试试。
|
52
CallMeReznov 2018-12-29 09:57:35 +08:00
|
53
lovelybear 2018-12-29 10:04:34 +08:00
现学现卖,现用现查
|
54
koalli 2018-12-29 10:07:13 +08:00
记不住,每次要用的时候不断地猜。。。
|
56
Honwhy 2018-12-29 10:18:58 +08:00
我读过精通正则表达式这本书,快忘得差不多了
正则表达式有方言区别,有语言实现上的差异 |
58
asj 2018-12-29 10:35:55 +08:00
用 vi
|
59
glouhao 2018-12-29 10:37:26 +08:00 via Android
我在火车头上练
|
60
abc635073826 2018-12-29 11:00:47 +08:00
🔍
|
61
wobuhuicode 2018-12-29 11:02:07 +08:00
没把规则记清楚,写太多也没用
|
62
zhaogaz 2018-12-29 11:10:30 +08:00
额,先理解正则的设计模型。
我理解的正则里面就是,做限定的,是什么,不是什么,要么是给定范围,或者,多次重复,单次重复啊,匹配字符串前后用零宽断言啊。 理解模型之后,剩下的就是查手册了。 找自己需要的东西。 |
63
geelaw 2018-12-29 11:14:38 +08:00
@bumz #45 我没有做很强的表达式优化,写出了一个长达 62.1 MB ( 65,152,515 个字符)的正则表达式匹配 13 的倍数(只匹配不带前导零、不带符号的正数)。输出的表达式使用计算机科学的常用语法(只用 | OR, () GROUP 和连接、空串)。
https://gist.github.com/GeeLaw/be3aec94a6ba7c3817ef2e16d261f616 匹配 3 的倍数是: (((2|5|8)(0|3|6|9)*(2|5|8)|1|4|7)((1|4|7)(0|3|6|9)*(2|5|8)|0|3|6|9)*((1|4|7)(0|3|6|9)*(1|4|7)|2|5|8)|(2|5|8)(0|3|6|9)*(1|4|7)|3|6|9)(((2|5|8)(0|3|6|9)*(2|5|8)|1|4|7)((1|4|7)(0|3|6|9)*(2|5|8)|0|3|6|9)*((1|4|7)(0|3|6|9)*(1|4|7)|2|5|8)|(2|5|8)(0|3|6|9)*(1|4|7)|0|3|6|9)* 注意该程序经常输出非最优解,例如对于 5 的倍数,最简单的解是 5|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(5|0),该程序输出的是一个长达 2899 字符的表达式。 |
64
afirefish 2018-12-29 11:32:10 +08:00
|
65
amwyyyy 2018-12-29 11:32:24 +08:00
分享下公司同事的分享,里面有些练习题挺不错的
|
66
amwyyyy 2018-12-29 11:32:31 +08:00
|
67
blueskea 2018-12-29 12:15:39 +08:00 via Android
用时一时爽,写多了写长了,维护起来是恶梦
|
68
Jex 2018-12-29 12:17:43 +08:00 1
|
69
reself 2018-12-29 13:06:55 +08:00 via Android
@usingnamespace 抱歉确实我说得太笼统了,为了学个正则去学一遍编译原理确实走偏了。就正则而言,只需要学编译原理里的词法那里就行了。再深入下去就是自动机,这个看个人需求了。相对于强记硬背那些鬼画符,从编译原理里选择性的学习是没错的。你觉得呢?
|
70
freedom1988 2018-12-29 13:14:50 +08:00
把学到的先记录总结,在用到的时候再查看,周而复始就会越来越熟练。可以参考此处 https://www.cnblogs.com/strick/category/907150.html
|
71
veightz 2018-12-29 13:20:43 +08:00
收藏一个适合自己的手册和一个实时测试工具
|
72
kaiser1992 2018-12-29 13:22:05 +08:00
形式化语言,把 NFA 和 DFA 撸一遍,再理解正则,应该记起来就快了
|
73
kaiser1992 2018-12-29 13:22:55 +08:00
@Honwhy 是啊,其实把语法搞明白也就好了
|
74
realkenshinji 2018-12-29 13:28:18 +08:00 via iPhone
Copy & Paste from Stackoverflow
|
75
hujianxin 2018-12-29 13:38:46 +08:00
平时多用 sed、vim,用着用着就忘不掉了
|
76
MarioLuisGarcia 2018-12-29 13:43:40 +08:00
有真实需要的“练习”是最高效的
|
77
LichMscy 2018-12-29 14:47:50 +08:00
|
78
arthasgxy 2018-12-29 14:55:00 +08:00
多用 vim
|
79
stzz 2018-12-29 15:31:22 +08:00
你们楼上的贴的都是啥鬼画符啊
|
80
xavierskip 2018-12-29 16:21:09 +08:00
用的不多,要用的时候就看看 7 楼的图,然后在线调试工具上试一试呗。
|
81
ourzhang 2018-12-29 16:30:46 +08:00
平时用的最多的就是在文本编译器里启用正则替换。。会解决一些重复性的工作。
项目中用的比较少。 |
82
hakono 2018-12-29 16:41:08 +08:00 via Android
楼主问正则你们推荐编译原理和自动机什么鬼
我虽然学过自动机理论也知道这些和正则的关系,但我只想说单纯为了用正则跑去学自动机这些实在是没必要,单纯就是给自己找虐。 |
83
kingwl 2018-12-29 17:50:02 +08:00
不推荐自动机难道推荐常用正则 300 例?
|
84
whitev2 2018-12-29 17:58:37 +08:00
|
86
hehe520347 2018-12-29 18:31:38 +08:00
学几次 忘几次
|
87
mPatrickStar 2018-12-29 18:46:23 +08:00
正则表达式比知必会小册子( https://book.douban.com/subject/26285406/) 跟着动手 动手 动手做一遍。如果有什么东西是付出少收益大的那正则算是一个,这玩意不难重点是要用。不仅仅是代码里匹配个邮箱、手机号什么的用,文本搜索替换也要用。
|
89
fox0001 2018-12-30 14:25:10 +08:00 via Android
用浏览器开发模式写,很方便
|
90
usingnamespace 2019-02-10 22:52:19 +08:00 via iPhone
@reself 你说的肯定是有道理 毕竟自己实践过就会有体会 但是 从编译原理里面选择学的话 编译原理又直接上龙书吗 我只是觉得很多人直接提编译原理从学习知识的方法论上肯定是有问题的
|