task 3#
# 参考答案
(?![EIOU])[B-Z]
# 主要是我没想到这个能这么用,一般我觉得?!的用法只是
# \d(?!nd) 用来匹配 1st 2nd 3pc 中除了2的其他两个数字
# 但是现在有了更深的理解,匹配的过程是先匹配后面的B-Z,然后把其中以EIOU其中的某一个开头的结果排除掉。
task 7#
# 我的答案
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|1?\d?\d)$
# hhh确实有点蠢这个方法,但是当时确实没想到可以用\b
# 好一点的答案
^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|\d{2}|\d)(?:\.|$)){4}\b$
# 抄作业改进自己的
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)(?:\.|$)){4}\b$
# 再改进一点点,尽力了44个字符,最优解是39
^(?:(?:25[0-5]|2[0-4]\d|1?\d?\d)\.?\b){4}$
task 8#
# 我的答案
<[^>]*>|^[^<]*>|<.*[^>]$
# 我的想法就是分情况,因为需要额外处理跨行情况下一行中没有<和没有>的两种情况
# 好一点的答案
(?:^|<)[^<>]*>|<[^>]*
# 对其稍加优化(当然也可以去掉?: 不过按照普遍规范,不重复使用时用?:更好)
(?:^|<)[^<]*>|<[^>]*
# 更好的答案
<[^>]*|[^<]*>
# 其实个人觉得有一点投机取巧了,因为这样虽然会得到正确结果 ,但实际上是拼接起来的,只有特定的情况下才能这么用吧
答案参考:[我的 Regex quiz 答案 - 丁丁の店 (butanediol.me)](https://blog.butanediol.me/2022/02/18/我的 Regex quiz 答案/#TASK-8-HTML-TAGS-OPTIONAL)
另一个不错的学习入门网站:Regex Learn
task 15#
首先思路就是匹配到任意字符.任意字符
的模式然后除掉数字.数字
的情况
任意字符我想到的表示方法就是:\s|.|^|$
所以得到正则表达式为:(?!\d\.\d)(\s|.|^)\.(\s|.|$)
匹配没有太大的问题(所以也是有问题的),但是这道题要求是替换,就不太行了,因为这样默认的单次替换无法处理类似...
的情况。如果将替换目标为$1-$2
,那么...
就会替换为.-.
,按题目要求应该替换为---
所以说,还是应该只匹配到那个点,再对其直接替换。方法就是把之前的表达式拆成两半:
(?<!\d)\.|\.(?!\d)