FE-star / 2018.1

第二期课程仓库,请勿fork,建议watch或者star
43 stars 7 forks source link

第五节课问题收集 #16

Open loskael opened 6 years ago

bluescurry commented 6 years ago

零宽断言都有哪些应用场景呢,能举个例子吗老老师

loskael commented 6 years ago

@H5futurehreohanshuo 有很多场景可以用 1、课上提到的,密码强度判定:不允许纯数字、纯小写字母、纯大写字母的密码,之前写过一篇文章,https://gist.github.com/yorts52/5d019933f02de9ef348c 2、需要把 showCase 替换成 show_case 就可以用这个(可以思考一下该怎么写) 3、对数字做分割,比如 1000.00 要展示成 1,000.00(可以思考一下该怎么写)

另外,对于不懂的复杂的正则表达式,推荐一个网站给大家 https://regexper.com/

Elliott-Hu commented 6 years ago

日期匹配中闰年二月和大小月实在太难写了,一条正则搞不定啊……只能分几步

loskael commented 6 years ago

@Elliott-Hu
闰年二月这个没必要用正则去处理,至于能不能用一条正则搞定,答案是可以,不过太复杂了,没这个必要 大小月的问题,除了二月,其他也还好了,并且这也可以算是零宽断言的一个应用场景

loskael commented 6 years ago

不妨看看这个问题的讨论,感受一下正则的强大 https://www.zhihu.com/question/24824487

@Elliott-Hu 这里补充一个判断 4 的倍数的写法

/(?:(?:^|[02468])[048]|[13579][26])$/
Elliott-Hu commented 6 years ago

太强大了……数字加逗号的正则我就想了一晚上,睡觉还在想🤣

let data = [123, 2, 1, 3123456, 1234567809, 12349333.04934];

function process(arr) {
  return arr.map(num => num.toString().replace(/(?<!\.\d*?)(\d+?)(?=(?:\d{3})+\b)/g, "$1,"))
}

console.log(process(data));
// ["123", "2", "1", "3,123,456", "1,234,567,809", "12,349,333.04934"]

但是js 不支持 "?<=" 和 “?<!” ,老师有什么好的转换方案吗?

bluescurry commented 6 years ago

exercise18里面的number校验 /^[-+]?(?:\d|(?=\d))(.\d)?$/ 校验一个空字符串也能通过。。。但是我不知道怎么完善这种情况。。。

tiantianhaohaowen commented 6 years ago

麻烦老师讲下正则 exercise 7 的练习,第三个test不会做

imhxc commented 6 years ago

老师,这句话什么意思

向前查找的模式长度是可变的,可以包含.+之类的元字符。但是向后查找模式只能是固定长度

我在测试没发现“向后查找的长度是固定的”这个有什么长度限制呀。

loskael commented 6 years ago

@imhxc 你这句话是哪来的?这句话本身就有问题

imhxc commented 6 years ago

@yorts52 《正则表达式必知必会》86页上面有一句这样的话。实际是怎么样的?没有限制吗?

imhxc commented 6 years ago

另外在《精通正则表达式》134页中也有类似的一句话:

最高层次的支持可以匹配任意长度的文本,只是其长度不能为无限。(?<!books?)可以直接使用,但是(?<!^\w+:)则不行,因为\w能够匹配的长度没有限制

怎么理解呀。

loskael commented 6 years ago

@imhxc 你再看看 《精通正则表达式》133 页的这段话

image

正则本身是没必要做这些限制的,不同的语言在实现上有差异也是正常,看书的时候还是要结合实际情况来看,并且语言本身也是在变化的,书上的内容也是有时效性的,但是匹配的原理不会变,看书的时候重点应该是理解其原理。

image image

loskael commented 6 years ago

image 我把后面这段话也贴上来了,这一段的意思很明显 java regex package 和 .net 都支持这种写法(这本书对js基本没讲),但是后面也说了支持这种写法的风险:运用不当,会有严重的效率(性能)问题

imhxc commented 6 years ago

嗯嗯,也就是说这只是一个各个语言对正则的实现的差异性,js中支持这种写法,但是建议最好不要这么用。

loskael commented 6 years ago

@imhxc 是的,如果你能熟练运用,这么用也无可厚非,当你理解原理了,要写出高性能的表达式也就不是难事了。

imhxc commented 6 years ago

@yorts52 好的 谢谢老师