JS、Python、Java中的正则表达式总结

从另外几个帖子总结了一些常用的正则表达式,便于今后查找、回顾和应用。

简述

正则表达式(或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.性能密集的应用程序

正则表达式的匹配速度可以从不是非常快到极慢的范围变动,取决于表达式写得怎么样。对于大多数用例来说,这很好,特别是如果匹配的文本很短(例如电子邮件地址表单)的话。然而,对于高性能服务器应用程序,正则表达式会成为性能瓶颈,特别是如果表达式写得不好或被搜索的文本很长的话。

参考帖子

多语言的正则表达式

Java正则表达式

JavaScript正则表达式

Python正则表达式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值