0
点赞
收藏
分享

微信扫一扫

Java学习笔记(22)

正则表达式(Regular Expression):
	定义:一种强大的文本处理工具,用于描述、匹配和查找字符串中的特定模式。
	应用:密码验证、文本搜索和替换、数据清洗等。
	特点:通过特定的元字符和规则来构建复杂的模式匹配表达式。
字符串处理:
	定义:对文本数据(字符串)进行操作和分析的过程。
	技术:包括字符串的拼接、分割、查找、替换等。
	关系:正则表达式常常用于实现高效的字符串处理。
编程语言:
	定义:用于编写计算机程序的工具,如Python、Java、PHP等。
	作用:提供语法规则、数据结构和算法库,用于实现各种功能。
	关系:正则表达式通常在编程语言中作为内置功能或库来使用,以进行模式匹配和文本处理。

regex

在蓝桥杯的网络安全竞赛中,正则表达式发挥着不可或缺的作用。
网络安全比赛通常涉及到对网络安全漏洞的挖掘、分析和利用,其中很多环节都需要对大量的日志数据、代码片段或网络流量进行分析。
而正则表达式正是处理这些文本数据的利器。

具体来说,正则表达式在网络安全比赛中的重要性体现在以下几个方面:

  • 日志分析:在网络安全比赛中,参赛者经常需要分析系统或应用的日志文件,以查找潜在的攻击痕迹或异常行为。通过编写合适的正则表达式,参赛者可以快速定位到关键信息,提高分析效率。
  • 代码审计:在代码审计环节,参赛者需要查找源代码中可能存在的安全漏洞。正则表达式可以帮助参赛者快速定位到特定的代码模式或函数调用,从而发现潜在的安全风险。
  • 网络流量分析:在网络安全比赛中,参赛者有时需要分析网络流量数据,以识别恶意流量或攻击行为。正则表达式可以帮助参赛者从大量的网络数据包中提取出关键信息,如特定的协议字段、IP地址或端口号等。

此外,正则表达式还可以用于编写自动化脚本、构建安全工具等方面,为参赛者在网络安全比赛中提供强大的技术支持。

接下来让我们从四个正则的题目,学习一下正则表达式基本用法。

一、电话号码

编写一个正则表达式,用于匹配以1开头的11位数字组成的电话号码。
^1\d{10}$
  • ^ 表示字符串的开始。
  • 1 匹配数字1。
  • \d{10} 匹配10个数字。
  • $ 表示字符串的结束。

二、HTTP网址

这个题目要求你构建一个正则表达式,能够识别并匹配大多数常见的URL结构。
一个基本的URL通常包括协议头(如http://或https://),域名(由子域名、主域名和顶级域名组成),以及可能存在的路径和查询参数。
注意,这个题目要求的是匹配“基本的”URL格式,因此不需要考虑所有可能的URL变种或特殊情况。

题目:编写一个正则表达式,用于匹配基本的URL格式。

^(https?:\/\/)?([\da-z.-]+)\.([a-z.-]{2,6})([\/\w .-]*)*\/?

regular expression

  1. ^:表示字符串的开始。

  2. (https?:\/\/)?

    • https?:匹配"http"或"https"。
    • :\/\/:匹配://
    • ?:表示前面的整个组(https?:\/\/)是可选的。
  3. ([\da-z.-]+)
    这部分用于匹配URL中的子域名部分,例如"www"或"subdomain"。

    • [\da-z.-]:匹配一个数字、字母、点号或短横线。
    • +:表示前面的字符集可以出现一次或多次。
  4. \.:匹配点号(.),在正则表达式中点号是一个特殊字符,所以需要使用反斜杠进行转义。

  5. ([a-z.]{2,6})
    这部分用于匹配顶级域名(TLD),如".com"、".org"等。

    • [a-z.]:匹配一个小写字母或点号。
    • {2,6}:表示前面的字符集可以出现2到6次。
  6. ([\/\w .-]*)*

    • [\/\w .-]:匹配斜杠(/)、单词字符(等同于[a-zA-Z0-9_])、点号、短横线。
    • *:表示前面的字符集可以出现0次或多次。
      外层的*表示前面的整个组([\/\w .-]*)可以出现0次或多次。
      这部分用于匹配URL中的路径和参数部分。
  7. \/?:匹配0个或1个斜杠。

这个正则表达式能够匹配大多数基本的URL格式,但它并不是完全严格的,因为URL的格式非常复杂,有很多特殊情况需要考虑。

三、IP地址

这个题目要求你编写一个能够精确匹配IPv4地址格式的正则表达式。
IPv4地址由四个数字段组成,每个数字段的值在0到255之间,段与段之间用点号(.)分隔。
正则表达式需要确保每个数字段都符合这个范围要求,并且整个地址的格式正确无误。

题目:编写一个正则表达式,用于匹配IPv4地址。

^((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]?)$

Capturing Group

  1. ^:表示字符串的开始。
  2. ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)
    • 这是一个分组,用于匹配IP地址中的一个段(0-255)。
    • 25[0-5]:匹配250到255。
    • 2[0-4][0-9]:匹配200到249。
    • [01]?[0-9][0-9]?:匹配0到199,其中[01]?表示0或1出现0次或1次,[0-9][0-9]?表示一个数字后面可以跟一个可选的数字。
    • \.:匹配点号(.)。
  3. {3}:表示前面的整个组(一个IP段和点号)重复3次,即匹配前三段IP地址。
  4. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):再次匹配IP地址中的一个段(0-255),但这次没有点号,因为这是在匹配最后一个段。
  5. $:表示字符串的结束。

这个正则表达式精确地匹配IPv4地址的格式,确保每个段都在0到255的范围内。

四、密码

密码的长度必须至少为8个字符。
密码中必须包含至少一个大写字母(A-Z)。
密码中必须包含至少一个小写字母(a-z)。
密码中必须包含至少一个数字(0-9)。
密码中必须包含至少一个特殊符号。(如!@#$%^&*._等)

题目:校验密码,必须是包含大小写字母、数字、特殊符号的8位以上组合

(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[\W_]).{8,}$

positive lookahead

  1. ^:匹配字符串的开始位置。
  2. (?=.*[a-z]):正向先行断言(positive lookahead),确保至少有一个小写字母存在。
    • (?=...):表示一个正向先行断言,它会在当前位置尝试匹配括号内的正则表达式,但不会消耗任何字符,也就是说,匹配成功后,会回到原来的位置继续后面的匹配。
    • .*:匹配任意数量的任意字符(换行符除外)。
    • [a-z]:匹配任意小写字母。
  3. (?=.*[A-Z]):正向先行断言,确保至少有一个大写字母存在。
    • [A-Z]:匹配任意大写字母。
  4. (?=.*\d):正向先行断言,确保至少有一个数字存在。
    • \d:匹配任意数字。
  5. (?=.*\W_):正向先行断言,确保至少有一个特殊符号存在。
    • \W_:匹配题目中任意特殊符号。
  6. .{8,}:匹配任意字符(换行符除外)至少8次。
    • .:匹配任意字符(除了换行符)。
    • {8,}:表示前面的元素(.)至少出现8次。
  7. $:匹配字符串的结束位置。

零宽断言除了正向先行断言之外,还包括以下三种:

结语

1. 正则表达式基础
	字符集:使用[]来定义一组字符,匹配其中的任意一个字符。
	元字符:具有特殊含义的字符,如.表示任意字符,*表示前面的元素出现0次或多次。
	转义字符:使用\来转义特殊字符,使其失去特殊含义。
2. 边界匹配
	^:匹配字符串的开始位置。
	$:匹配字符串的结束位置。
3. 量词
	*:匹配前面的元素0次或多次。
	+:匹配前面的元素1次或多次。
	?:匹配前面的元素0次或1次。
	{n}:匹配前面的元素恰好n次。
4. 分组与捕获
	():用于分组,也可以捕获匹配的子串。

regex learn
通过这次的学习,你已经掌握了正则表达式的基础知识,并了解了如何应用它们来解决实际问题。正则表达式的功能非常强大,但也需要一定的实践和经验来熟练掌握。建议你在实际项目中多使用正则表达式,通过实践来加深理解和提高应用能力。

思考:如何用正则的零宽断言获取小米商店的HTTPS链接?后面的参数?(如https://www.mi.com/shop/buy/detail?product_id=10050036)

学习地址:https://regexone.com/
这类网站上也会提供很多案例,比如查找给定文本等等,可以更好地学习正则。

练习地址:https://regex101.com/
只需要输入匹配的语法公式,便可以查询出对应的文本,文本会自动高亮显示。

举报

相关推荐

0 条评论