跳过正文
  1. 博客/

正则表达式练习 regex101

·718 字·2 分钟· ·
学习总结 正则表达式
目录

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)