正则表达式学习详解
正则表达式
正则表达式(Regular Expression),通常简称为正则或正则表达式,是一种用于描述字符串模式的工具。它是由一系列字符和特殊字符组成的字符串,用于定义搜索模式或进行字符串匹配、替换、提取等操作。
正则表达式提供了一种灵活、强大且通用的方式来处理文本。它可以用于各种编程语言和文本编辑器中,例如Python、Java、JavaScript等,几乎所有语言很多场景都可以用到正则表达式。
使用正则表达式,可以进行以下操作:
- 匹配:检查一个字符串是否与指定的模式匹配。
- 搜索:在一个字符串中搜索满足指定模式的内容。
- 替换:将字符串中满足指定模式的部分替换为其他内容。
- 提取:从一个字符串中提取出满足指定模式的内容。
正则表达式使用一些特殊字符和语法来表示不同的匹配规则,例如:
- 字符匹配:使用普通字符表示匹配该字符本身。
- 字符类:使用方括号 [] 表示匹配指定范围内的字符。
- 量词:使用特殊字符表示匹配字符出现的次数,如 *、+、?、{}。
- 边界匹配:使用特殊字符表示匹配字符串的边界或位置,如 ^、$、\b。
- 分组:使用圆括号 () 表示将一组字符作为一个单元进行匹配或提取。
正则表达式的语法和特性因不同的实现和工具而略有差异,但基本的概念和常用的模式匹配规则是通用的。
学习工具推荐:
下载与安装
你可以使用以下两种方式中的任意一个来下载安装正则表达式测试器,这个工具源文本内容不能输入太多,要么有时候会匹配不成功。
- 安装版
- 下载 Regester安装程序
- 解压后运行 RegesterSetup.zh.exe
- 绿色版
- 下载 Regester
- 解压后运行 Regester.exe
- 如果无法启动,请自行下载安装 Microsoft .Net Framework 4.8 后再试
常见正则表达式命令和参数解释:
-
.
(点号):匹配除换行符外的任意字符。- 示例:
a.b
可以匹配 “aab”、“acb”、“adb” 等,但不匹配 “a\nb”。
- 示例:
-
*
:匹配前面的字符零次或多次。- 示例:
ab*c
可以匹配 “ac”、“abc”、“abbc” 等。
- 示例:
-
+
:匹配前面的字符一次或多次。- 示例:
ab+c
可以匹配 “abc”、“abbc” 等,但不匹配 “ac”。
- 示例:
-
?
:匹配前面的字符零次或一次。- 示例:
ab?c
可以匹配 “ac”、“abc”,但不匹配 “abbc”。
- 示例:
-
[]
(字符类):匹配方括号内的任意字符。- 示例:
[abc]
可以匹配 “a”、“b”、“c” 中的任意一个字符。
- 示例:
-
[^]
(否定字符类):匹配不在方括号内的任意字符。- 示例:
[^abc]
可以匹配除了 “a”、“b”、“c” 以外的任意字符。
- 示例:
-
\d
:匹配任意数字字符(0-9)。- 示例:
\d+
可以匹配一个或多个数字字符。
- 示例:
-
\w
:匹配任意字母、数字或下划线字符。- 示例:
\w+
可以匹配一个或多个字母、数字或下划线字符。
- 示例:
-
\s
:匹配任意空白字符(空格、制表符、换行符等)。- 示例:
\s+
可以匹配一个或多个空白字符。
- 示例:
-
^
:匹配字符串的开头。- 示例:
^abc
可以匹配以 “abc” 开头的字符串。
- 示例:
-
$
:匹配字符串的结尾。- 示例:
abc$
可以匹配以 “abc” 结尾的字符串。
- 示例:
-
()
(分组):将字符组合成一个单元,可以对其进行操作。- 示例:
(ab)+
可以匹配 “ab”、“abab”、“ababab” 等。
- 示例:
零宽断言匹配示例:
零宽断言(Zero-width assertions)是正则表达式中的一种特殊语法,用于在匹配过程中对位置进行条件限制,而不匹配实际的字符。它们被称为零宽度断言,因为它们不会消耗字符串中的字符,仅用于确定匹配发生的位置。
零宽断言分为正向断言(Lookahead)和负向断言(Lookbehind)两种类型。正向断言用于指定位置后面的条件,负向断言用于指定位置前面的条件。
-
正向肯定预查(Positive Lookahead):
(?=abc)
:匹配后面紧跟着 “abc” 的位置。- 示例:
a(?=bc)
可以匹配 “a”,但只有在后面跟着 “bc” 的情况下才匹配成功。
-
正向否定预查(Negative Lookahead):
(?!abc)
:匹配后面不紧跟着 “abc” 的位置。- 示例:
a(?!bc)
可以匹配 “a”,但只有在后面不跟着 “bc” 的情况下才匹配成功。
-
负向肯定预查(Positive Lookbehind):
(?<=abc)
:匹配前面紧跟着 “abc” 的位置。- 示例:
(?<=ab)c
可以匹配 “c”,但只有在前面紧跟着 “ab” 的情况下才匹配成功。
-
负向否定预查(Negative Lookbehind):
(?<!abc)
:匹配前面不紧跟着 “abc” 的位置。- 示例:
(?<!ab)c
可以匹配 “c”,但只有在前面不跟着 “ab” 的情况下才匹配成功。
贪婪匹配非贪婪匹配
贪婪匹配(Greedy matching)和非贪婪匹配(Non-greedy matching)是正则表达式中量词(匹配内容多还是少)的匹配模式。
贪婪匹配
是指在满足匹配条件的前提下,尽可能多地匹配字符。它会尽量扩展匹配的范围,直到无法再匹配为止。贪婪匹配使用量词 +
、*
、{n,}
等,默认情况下都是贪婪匹配。
例如:正则表达式 a+
会尽量匹配连续重复的字符 “a”,直到遇到不是 “a” 的字符为止。
非贪婪匹配
是指在满足匹配条件的前提下,尽可能少地匹配字符。它会尽量缩小匹配的范围,以便允许后续的匹配得到满足。非贪婪匹配使用量词后面添加 ?
来表示。例如,正则表达式 a+?
会匹配尽可能少的连续重复的字符 “a”,以满足匹配的条件。
通过比较贪婪匹配和非贪婪匹配,可以更好地控制正则表达式的匹配行为。贪婪匹配通常用于尽可能多地捕获匹配的内容,而非贪婪匹配通常用于尽可能少地匹配,特别是在需要处理嵌套结构或提取特定部分的情况下非常有用。
贪婪匹配示例:
正则表达式:[a-z]+
输入字符串:abcdefg
匹配结果:abcdefg
解释:贪婪匹配会尽可能多地匹配小写字母。在这个示例中,正则表达式 [a-z]+ 匹配了整个字符串 abcdefg,因为它可以匹配一个或多个连续的小写字母。
非贪婪匹配示例:
正则表达式:[a-z]+?
输入字符串:abcdefg
匹配结果:a
解释:非贪婪匹配使用 ? 后缀来指示尽可能少地匹配小写字母。在这个示例中,正则表达式 [a-z]+? 只匹配了第一个小写字母 “a”,因为它尽可能少地匹配满足条件的字符。
贪婪匹配和非贪婪匹配的比较:
正则表达式:“.+”
输入字符串:“Hello” “World”
匹配结果(贪婪匹配):“Hello” “World”
匹配结果(非贪婪匹配):“Hello”
解释:贪婪匹配会尽可能多地匹配字符,因此 “.+” 会匹配整个字符串 “Hello” “World”。而非贪婪匹配则尽可能少地匹配字符,因此 “.+?” 只匹配了第一个字符串 “Hello”。
贪婪匹配和非贪婪匹配的比较:
正则表达式:[0-9]+
输入字符串:12345
匹配结果(贪婪匹配):12345
匹配结果(非贪婪匹配):12345
解释:无论是贪婪匹配还是非贪婪匹配,正则表达式 [0-9]+ 都会匹配整个字符串 12345,因为它可以匹配一个或多个连续的数字。
正则表达式练习题:
- 匹配邮箱地址:
正则表达式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
示例输入:example@example.com
^:表示匹配字符串的开头。
\w+:表示匹配一个或多个字母、数字或下划线,这部分匹配了邮箱地址的用户名部分。
([-+.]\w+)*
:表示匹配一个连字符、加号或句点后跟一个或多个字母、数字或下划线的组合,这部分匹配了用户名中的特殊字符及后续字符,可以重复零次或多次。@:表示匹配邮箱地址中的@
\w+:表示匹配一个或多个字母、数字或下划线,这部分匹配了邮箱地址的域名中的名称部分。
([-.]\w+)*
:表示匹配一个连字符或句点后跟一个或多个字母、数字或下划线的组合,这部分匹配了域名中的特殊字符及后续字符,可以重复零次或多次。
.:表示匹配邮箱地址中的点号(.),需要使用反斜杠进行转义。\w+:表示匹配一个或多个字母、数字或下划线,这部分匹配了邮箱地址中的顶级域名部分。
([-.]\w+)*
:表示匹配一个连字符或句点后跟一个或多个字母、数字或下划线的组合,这部分匹配了顶级域名中的特殊字符及后续字符,可以重复零次或多次。
$:表示匹配字符串的结尾。
- 匹配手机号码(简化版):
正则表达式:^\d{11}$
示例输入:12345678901
^:表示匹配字符串的开头。
\d:表示匹配一个数字。
{11}:表示前面的元素(即数字)必须连续重复11次。
$:表示匹配字符串的结尾。
- 匹配日期(格式为YYYY-MM-DD):
正则表达式:^\d{4}-\d{2}-\d{2}$
示例输入:2023-08-09
^:表示匹配字符串的开头。
\d:表示匹配一个数字。
{4}:表示前面的元素(即数字)必须连续重复4次,即匹配4位数字的年份。
-:表示匹配连字符。
\d{2}:表示前面的元素(即数字)必须连续重复2次,即匹配2位数字的月份。
-:表示匹配连字符。
\d{2}:表示前面的元素(即数字)必须连续重复2次,即匹配2位数字的日期。
$:表示匹配字符串的结尾。
- 匹配URL(以http或https开头):
正则表达式:^(http|https)://[^\s/$.?#].[^\s]*$
示例输入:https://www.example.com
^:表示匹配字符串的开头。
(http|https):使用括号和竖线(|)表示分组,表示匹配 http 或 https。
😕/:表示匹配 😕/ 字符串。
[^\s/$.?#]
:表示匹配任意不是空白字符、斜杠、问号、点号或井号的字符。
.:表示匹配一个任意字符。
[^\s]*
:表示匹配零个或多个任意不是空白字符的字符。
$:表示匹配字符串的结尾。
- 匹配整数(包括正负整数):
正则表达式:^-?\d+$
示例输入:-123
^:表示匹配字符串的开头。
-?:表示匹配可选的负号(减号)。- 表示匹配一个负号,? 表示前面的元素(即负号)可选。
\d+:表示匹配一个或多个数字。
$:表示匹配字符串的结尾。
- 匹配英文句子(以句号结尾):
正则表达式:^[A-Z][^.!?]*\.$
示例输入:This is a sentence.
^:表示匹配字符串的开头。
[A-Z]:表示匹配一个大写字母。
[^.!?]*
:表示匹配零个或多个非句号、非问号和非感叹号的字符。这个部分用于匹配句子中除了句号以外的其他内容。
.:表示匹配句号。需要使用反斜杠进行转义,因为句号在正则表达式中是一个特殊字符。
$:表示匹配字符串的结尾。
- 匹配HTML标签(包括属性):
正则表达式:<([a-z]+)(\s[a-z]+\s*=\s*"[^"]*")*\s*>.*<\/\1>$
示例输入:<div class="example">This is a div.</div>
匹配结果:匹配成功
<([a-z]+):表示匹配以 < 开始的标签,并捕获标签名。 [a-z]+ 表示匹配一个或多个小写字母。
(\s[a-z]+\s*=\s*"[^"]*")*
:表示匹配零个或多个属性,每个属性由一个或多个小写字母组成的属性名、可选的空白字符、等号、可选的空白字符、以及由双引号包围的属性值组成。这部分用于匹配标签中的属性。
\s*>
:表示匹配以空白字符结尾并以 > 结束的标签起始部分。
.*
:表示匹配零个或多个任意字符,用于匹配标签内的内容。
</\1>:表示匹配以 </ 开始、后跟与起始标签相同的标签名、以 > 结束的结束标签。 \1 表示引用第一个捕获组中的标签名。
- 匹配IP地址(简易版):
正则表达式:^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$
示例输入:192.168.0.1
匹配结果:匹配成功
^:表示匹配字符串的开头。
\d{1,3}:表示匹配一个由 1 到 3 位数字组成的部分。
.:表示匹配一个点号(.)。需要使用反斜杠进行转义,因为点号在正则表达式中是一个特殊字符。
.:表示匹配任意字符。
$:表示匹配字符串的结尾。
- 匹配邮政编码(6位数字):
正则表达式:^\d{6}$
示例输入:123456
匹配结果:匹配成功
^:表示匹配字符串的开头。
\d{6}:表示匹配六个连续的数字。
\d:表示匹配一个数字。
{6}:表示前面的元素(即数字)重复出现六次。
$:表示匹配字符串的结尾。
- 匹配用户名(由字母、数字、下划线组成,长度为4-16位):
正则表达式:^[a-zA-Z0-9_]{4,16}$
示例输入:user_123
匹配结果:匹配成功
^:表示匹配字符串的开头。
[a-zA-Z0-9_]:表示匹配一个字母(大小写)、数字或下划线字符。
{4,16}:表示前面的元素(即字母、数字或下划线)重复出现 4 到 16 次,限制了字符串的长度范围。
$:表示匹配字符串的结尾。
我们为什么需要学习正则表达式:
-
文本处理和搜索: 正则表达式是一种强大的工具,可用于在文本中进行搜索、匹配、替换和提取操作。它们可以帮助你快速有效地处理和操纵文本数据。
-
模式匹配和验证: 正则表达式是用于匹配和验证特定模式的工具。你可以使用它们来验证输入数据的格式、匹配特定模式的字符串,例如邮箱地址、URL、电话号码等。
-
编程和脚本语言支持: 正则表达式在许多编程语言和脚本语言中都有广泛的支持,包括 Python、JavaScript、Java、C#等。了解正则表达式可以帮助你在编程中更好地处理字符串操作。
-
文本编辑器和IDE: 许多文本编辑器和集成开发环境(IDE)都支持正则表达式搜索和替换功能。掌握正则表达式可以提高你在编码和文本编辑过程中的效率。
-
数据清洗和提取: 在数据处理和清洗过程中,正则表达式可以帮助你快速提取、筛选和转换数据。它们特别适用于处理大量文本数据或具有特定格式的数据。
-
网络爬虫和数据抓取: 当你需要从网页或其他来源中抓取数据时,正则表达式可以帮助你定位和提取所需的信息。它们是构建简单的网络爬虫和数据抓取工具的有用工具。
学习正则表达式可以提升你在文本处理、模式匹配、数据清洗和编程方面的技能。它们是处理和操作文本的强大工具,广泛应用于软件开发、数据分析、文本处理等领域。掌握正则表达式将为你提供更多的灵活性和能力来处理和操作各种类型的文本数据。
相关文章:
正则表达式学习详解
正则表达式 正则表达式(Regular Expression),通常简称为正则或正则表达式,是一种用于描述字符串模式的工具。它是由一系列字符和特殊字符组成的字符串,用于定义搜索模式或进行字符串匹配、替换、提取等操作。 正则表…...
工具箱:在线免费使用的文档工具:(PDF转换,图片压缩等)
这些都是博主亲自使用过的,可以使用。 PDF转换器: http://www.pdfdo.com/ 图片压缩: 免费在线图片/视频压缩工具 | 图片压缩 | 免费 JPG PNG GIF 图像压缩 (yalijuda.com) 文档OCR转EXCEL: 文字识别 OCR_ 图片文字识别_图片文字智能识别…...

Qt6之QStackedWidget——Qt仿ToDesk(2)
一、 QStackedWidget概述 QStackedWidget也叫堆栈窗体类,它继承于QFrame,主要与QListWidget等结合使用,实现“一个界面多个页面切换”。 二、QStackedWidget示例 如下图,当点击左边 QListWidget里的菜单时,右边跟随切…...

Harbor企业镜像仓库部署(本地)
简述: Docker 官方镜像仓库是用于管理公共镜像的地方,大家可以在上面找到想要的镜像,也可以把自己的镜像推送上去。但是有时候服务器无法访问互联网,或者不希望将自己的镜像放到互联网上,那么就需要用到 Docker Regis…...
【Linux】如何打包成动静态库,第三方动静态库如何使用?
文章目录 1. 打包成静态库2. 打包成动态库(共享库)3. 使用第三方静态库4. 使用第三方动态库 5. 动态库的加载6. 注意事项 库的名称:去掉前面的 lib 去掉后面的 .a(版本号) .so(版本号) 剩下的,才是库正真的名称。 查看文件依赖库…...
SAP MM学习笔记20- SAP中的英文2 - SD中英文,日语,中文
SD模块中的英文,日语,中文 对照。 販売管理 日本語英語中国語受注伝票sales order销售订单出荷伝票delivery order交货订单ピッキングリストpicking list领货清单シップメント伝票shipment document发运单据出庫確認post goods issue发货确认請求伝票b…...
计算机网络中的一些基本概念
IP地址: 址用于定位主机的网络地址。是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节).**端口号:**在网络通信中,IP地址用于标识主机网络地址,端口号可以标识主机中发送数据、接收数据的进程。简单…...

pytest 用例运行方式
一、命令行方式运行 执行某个目录下所有的用例,符合规范的所有用例 进入到对应的目录,直接执行pytest; 例如需要执行testcases 下的所有用例; 可以进入testcases 目录; 然后执行pytest 进入对应目录的上级目录,执行pytest 目录名称/ ; ; 例如需要执行testcases 下…...

简单入门seleniumUI自动化测试
目录 一、selenium的介绍 二、selenium的原理 三、selenium的八种元素定位的方法 1、ID定位: 2 、name定位: 3、class定位: 4、tag定位: 5、link_text定位: 6、partial_link_text定位: 7、css定位…...

Excel(1):表头或列头冻结
1.需求 对于较大的excel,通常需要固定一部分内容,另一份内容为可翻动。 2.解决方式 在视图中选择冻结窗格,需要注意的是,选择冻结窗格时,窗格的左上方的表格区域是固定不动的,只可以向下或者向右活动。...

通达OA SQL注入漏洞【CVE-2023-4166】
通达OA SQL注入漏洞【CVE-2023-4166】 一、产品简介二、漏洞概述三、影响范围四、复现环境POC小龙POC检测工具: 五、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损…...

全网最细,Python接口自动化测试-Session会话保持(实战详细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在接口测试的过程…...
Java项目初始化ES、MYSQL表结构及表数据
一、初始化MYSQL数据 public boolean initMysql() throws Exception {log.info("initMysql.start");//获取所连接的数据库名称String database systemMapper.getDatabase();if (StringUtils.isBlank(database)) {throw new BusinessException("连接数据库失败,…...
2023-08-13力扣每日一题
链接: 88. 合并两个有序数组 题意: 如题 解: 从后往前(从大到小)插入排序,这样就不会影响原先的有序性 实际代码: #include<bits/stdc.h> using namespace std; void merge(vector…...

下一代深度学习的思考与若干问题
下一代深度学习的思考和若干问题...

【Linux】IP协议——网络层
目录 IP协议 基本概念 IP协议格式 分片与组装 网段划分 特殊的IP地址 IP地址的数量限制 私网IP地址和公网IP地址 路由 路由表生成算法 IP协议 IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议…...

【CSS学习笔记】
学习内容 1.css是什么 2.CSS怎么用(快速入门) 3.CSS选择器(重点 难点) 4.美化页面(文字、阴影、超链接、列表、渐变…) 5.盒子模型 6.浮动 7.定位 8.网页动画(特效) 1.什么是CSS C…...

2023-arxiv-LLaMA: Open and Efficient Foundation Language Models
开放和高效的基础语言模型 Paper:https://arxiv.org/abs/2302.13971 Code: https://github.com/facebookresearch/llama 摘要 本文介绍了 LLaMA,这是⼀个包含 7B 到 65B 参数的基础语⾔模型的集合。作者在数万亿个令牌上训练模型,并表明可以…...

Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全
CTFshow XXE web373 学习资料: (梭哈~) https://www.cnblogs.com/20175211lyz/p/11413335.html https://www.cnblogs.com/zhaijiahui/p/9147595.html https://www.cnblogs.com/r00tuser/p/7255939.html https://mp.weixin.qq.com/s?__bizMz…...

小内存嵌入式设备软件的差分升级设计(学习)
摘要 提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案,即使用单片机内的Flash空间替代算法占用的RAM空间,从而减少算法对单片机RAM空间的需求,以满足小内存微处理器的差分升级,同时对算法内存分配释放函数…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...