正则表达式
- 简述
- 1.匹配任何数字——\^[0-9]+$ = ^\d+$
- 2.计数年份——查找20或21世纪内年份的次数。
- 3.匹配24小时时间——\b([01]?[0-9]|2[0-3]): ([0-5]\d)\b,时和分的2个捕获组
- 4.匹配日期——年月日,\b(0?[1-9]|[12]\d|3[01])([\\/\\-])(0?[1-9]|1[012])\2(\d{4})
- 5. 日期转化——将使用国际日期格式(DAY/MONTH/YEAR)的文档集合转换为美式(MONTH/DAY/YEAR)日期样式。
- 6.电子邮件验证——\^[\^@\s]+@[\^@\s]+\\.\w{2,6}$
- 7.提取/\* \*/的单行注释——(\\/\\*+)(.\*)(\\\*+\\/)
- 8.匹配网址
- 9.命令行的用法,匹配图像
- 不适合正则表达式的情形
- 参考帖子
从另外几个帖子总结了一些常用的正则表达式,便于今后查找、回顾和应用。
简述
正则表达式(或Regex,或Regexp)是使用字符序列描述复杂搜索模式的一种方式。几乎任何编程语言都可以使用Regex。Regex的知识对于验证用户输入,与Unix shell进行交互,在你喜欢的文本编辑器中搜索/重构代码,执行数据库文本搜索等等都非常有用。正则表达式,软件工程中最为强大,且广泛适用,令人信服的技术之一。从验证电子邮件地址到执行复杂的代码重构器,正则表达式的用途非常广泛,是任何软件工程师工具箱中必不可少的条目。
1.匹配任何数字——^[0-9]+$ = ^\d+$
JS
/^([0-9]+)$/gm
Python
regex = re.compile(r’^([0-9]+)$’, re.MULTILINE)
Java
Pattern pattern = Pattern.compile("^[0-9]+$", Pattern.MULTILINE);
2.计数年份——查找20或21世纪内年份的次数。
Python
regex = r"\b(?:19|20)\d{2}\b"
3.匹配24小时时间——\b([01]?[0-9]|2[0-3]): ([0-5]\d)\b,时和分的2个捕获组
\b——字边界
[01]——0或1
?——表示上述模式是可选的。
[0-9]—— 0到9之间的任何数字
|——OR操作数
2[0-3]——2,后面跟0和3之间的任何数字(即20-23)
:——匹配:字符
[0-5]——0到5之间的任何数字
\d——0到9之间的任何数字(与[0-9]相同)
\b ——字边界
JS
/\b([01]?[0-9]|2[0-3]): ([0-5]\d)/
4.匹配日期——年月日,\b(0?[1-9]|[12]\d|3[01])([\/\-])(0?[1-9]|1[012])\2(\d{4})
(0?[1-9]|[12]\d|3[01])——匹配1到31之间的任何数字(前面的0是可选的)
([\/\-])——匹配分隔符/或-
(0?[1-9]|1[012])—— 匹配1到12之间的数字
\2——匹配第二个捕获组(分隔符)
\d{4}——匹配任意4位数(0000 – 9999)
5. 日期转化——将使用国际日期格式(DAY/MONTH/YEAR)的文档集合转换为美式(MONTH/DAY/YEAR)日期样式。
通过替换模式$3$2$1$2$4或\3\2\1\2\4使用上述正则表达式
JS
const regex = /\b(0?[1-9]|[12]\d|3[01])([\/\-])(0?[1-9]|1[012])\2(\d{4})/
const subst = $3$2$1$2$4
const result = str.replace(regex, subst)
Python
regex = r’\b(0?[1-9]|[12]\d|3[01])([\/\-])(0?[1-9]|1[012])\2(\d{4})’
subst = r’\3\2\1\2\4’
result = re.sub(regex, subst, test_str)
6.电子邮件验证——^[^@\s]+@[^@\s]+\.\w{2,6}$
^——输入开始
[^@\s]——匹配除@和空格\s之外的任何字符
+——1+次数
@——匹配’@'符号
[^@\s]+——匹配除@和空格之外的任何字符,1+次数
\.——匹配’.'字符。
\w{2,6}——匹配任何字符(字母,数字或下划线),2-6次
$——输入结束
JS
const regex = /^[^@\s]+@[^@\s]+\.\w{2,6}$/g;
这是一个非常简单的例子,它忽略了许多非常重要的电子邮件有效性边缘情况,例如无效的开始/结束字符以及连续的周期。我真的不建议在你的应用程序中使用上述表达式;最好是使用一个有信誉的电子邮件验证库或继续探索更完整的电子邮件验证Regex。
更优的正则方案
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
7.提取/* */的单行注释——(\/\*+)(.*)(\*+\/)
\/——匹配/符号(我们有转义/字符)
\*+——匹配一个或多个*符号(再次,我们使用\来转义*字符)。
(.*)——匹配任何字符(除了换行符\n),任意次数
\*+——匹配一个或多个*字符
\/——匹配关闭/符号。
7.1 将单行注释替换为多行注释
$1\n$2\n$3
7.2 将所有的注释统一为一种格式
(\/\*{2,})(.*)(\*+\/),用/*$2$3替换
8.匹配网址
(https?:\/\/)(www\.)?(?<domain>[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6})(?<path>\/[-a-zA-Z0-9@:%_\/+.~#?&=]*)?
命名捕获组?<name>标识符开头
Python-识别域名并打印
regex = r"(https?:\/\/)(www\.)?(?P<domain>[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6})(?P<path>\/[-a-zA-Z0-9@:%_\/+.~#?&=]*)?"
for match in matches:
print(match.group('domain'))
9.命令行的用法,匹配图像
^.+\.(?i)(png|jpg|jpeg|gif|webp)$
ls ~/Downloads | grep -E '^.+\.(?i)(png|jpg|jpeg|gif|webp)$'
不适合正则表达式的情形
1.语言解析
2.安全(输入过滤和黑名单)
3.性能密集的应用程序
正则表达式的匹配速度可以从不是非常快到极慢的范围变动,取决于表达式写得怎么样。对于大多数用例来说,这很好,特别是如果匹配的文本很短(例如电子邮件地址表单)的话。然而,对于高性能服务器应用程序,正则表达式会成为性能瓶颈,特别是如果表达式写得不好或被搜索的文本很长的话。