一、Qt初尝试,做一个QT计算器《QT 入门到实战》

学习目标

  • 了解 qt 的基本信息
  • 了解 qt 的下载及安装
  • 了解创建一个基本 qt 项目的流程
  • 了解信号与槽
  • 通过示例了解信号与槽的设置与编写
  • 了解控件添加的方式
  • 了解控件如何使用代码获取其文本
  • 了解控件如何使用代码设置其文本
  • 使用 connect 自定义信号与槽
  • 了解使用样式修饰控件外观
  • 了解使用代码清空控件文本
  • 学习使用Qt 编写一个四则算术计算器

注:本章中使用的一些方法方法是为了简单的了解一下概念性质,例如在多个槽函数时使用的方法并不是简便的,简便的方法在之后的学习中将会进行讲解。

一、简单了解 Qt 及下载安装

1.1 简单了解 Qt

qt 是 C++ 的图形用户工具,是一个跨平台的用户界面解决方案;Qt 几乎支持所有的系统平台,并且是面向对象的。

Qt 的跨平台是非常强大的,例如可支持 win下的 XP、Vista、Win7/8/10 等 Windows 系统,并且对于Linux 下 X11、HP-UX、BSD/OS 又或是 嵌入式 Linux 平台 等都是支持的,甚至是 Mac 平台也支持。

1.2 Qt 下载及安装

Qt 分为商业版以及开源版,在此我们使用开源版本,开源版本是免费的。

Qt 开源版本的下载链接为 https://www.qt.io/download,打开链接中,往下滑动页面,找到开源版本下载板块:

在这里插入图片描述

点击后,将会跳转到一个页面,往下拉页面,点击下载 qt 二进制在线安装:

在这里插入图片描述

之后将会跳转到一个页面,并且会根据你的系统推荐你使用某个版本:

在这里插入图片描述

最后点击 Download 即可下载,安装步骤操作简单不再赘述,以上介绍开源版下载方式是因为部分同学认为Qt 是收费的,所以在此介绍开源版的下载方法(可能由于时间问题网页更新会导致下载“路径”不同)。

1.3 项目示例

Qt 作为一款优秀的 GUI 解决方案许多经典流行的应用使用了 Qt 进行开发,例如 WPS:

在这里插入图片描述
谷歌地球:

在这里插入图片描述

VirtualBox 虚拟机:

在这里插入图片描述

Linux 桌面系统等。

二、Qt Creator 界面介绍 及 第一个Qt 程序创建

2.1 简单的第一个 qt 程序

Qt 界面中自带了很多项目示例,可以通过 查看 Qt 示例学习经典项目的开发:

在这里插入图片描述
Qt 自带了教程,查看教程可以观看资料,不过是英文的,有英文能力的同学推荐阅读:

在这里插入图片描述
点击创建项目将会弹出一个窗口,选择对应的模板将会可以创建不同的项目:

在这里插入图片描述
在以上所选择的模板中最右侧是对应的模板介绍:

在这里插入图片描述
该模板是创建一个桌面 Qt 程序,以及包含了一个用于设计的 Qt 窗口。

点击选择可以进入下一步,在下一步窗口中选择项目名称以及对应项目存放的位置:
在这里插入图片描述
在此需要注意,名称和路径不能有中文,接着一直下一步,知道出现语言选择时在此你可以选择中文:

在这里插入图片描述

接着一直下一步进行操作即可,完成后将会弹出所创建的项目的基本内容:

在这里插入图片描述

接着,点击运行将会出现一个 空窗口:

在这里插入图片描述

三、信号与槽

3.1 信号与槽的基本示例

信号在 Qt 中指的是一个事件,例如当你点击一个按钮时会触发点击的事件,也就是信号,触发完毕后你需要某一个“动作”对其作出响应,或者说当收到信号后将会执行一些动作,而这个动作则是槽,又或者说是一个对信号响应的代码块。

此时我们可以通过一个例子来简单的理解一下信号与槽的概念,点击创建项目,最后创建一个 Qt Widgets 的 App 应用:

在这里插入图片描述
随后指定文件目录后一直点击下一步即可:
在这里插入图片描述

接下来点击 mainwindow.ui 文件:

在这里插入图片描述
点击之后将会出现一个设计窗口:

在这里插入图片描述
这个窗口如图所示,左侧是对应的基本空间区域,右侧是对应的设计窗口。我们可以通过拖拽左侧的控件到右侧的设计窗口之上,使当前 window 添加对应的控件,例如:

在这里插入图片描述

此时可以点击整个 Qt creator 左下角的运行按钮对整个项目编译运行:

在这里插入图片描述

运行之后,将会出现一个窗体程序,这个窗体程序在界面之上有一个 pushbutton:

在这里插入图片描述

为了实现信号与槽这个概念,我们可以再拖拽一个 edit 控件到窗体之上,由于一个 edit 是一个可编辑的控件,那么必然是输入 input Widgets,我们在 input Widgets 控件之下可以找到对应的 line Edit:

在这里插入图片描述
此时拖拽这个控件到窗体之上:

在这里插入图片描述
接着我们开始试验信号与槽。我们右键 PushButton,将会出现跳转到槽的选择项:

在这里插入图片描述

此时将会出现一个信号选择框,我们可以选择在什么情况下触发这个槽函数:

在这里插入图片描述

在这里选择 clicked 指在点击时触发这个槽函数。选择完毕后, qt creator 将会跳转窗口到一个编辑页,此时编辑页中出现的 on_pushButton_clicked 则是点击 pushButton 按钮后将会跳转到的槽函数:

在这里插入图片描述

那此时我们该在这里编写什么代码呢?此时我们可以编写一些动作,例如直接将当前按钮的文本改变成 lineEdit 空间所输入的文本,那么就可以很好的演示当点击按钮后执行代码后界面所产生的反应。

此时我们可以编写代码:

void MainWindow::on_pushButton_clicked(){QString inputText=ui->lineEdit->text();ui->pushButton->setText(inputText);
}

其中 QString inputText=ui->lineEdit->text(); 表示新建一个 QString 类型的 inputText 变量用来获取对应输入框所输入的内容;获取输入框需要指定到窗口上的某个空间,我们需要通过 ui 进行获取,ui-> 指 ui 上的某个空间,由于在窗体上的输入框名称默认为 lineEdit 所以直接写成 lineEdit 即可,查看 控件名称 直接点击控件后可在 Qt creator 右上角进行查看:

在这里插入图片描述

此时代码为 ui->lineEdit 表示指定到了某个元素,而最后的 ->text() 则表示获取当前控件的文本内容,获取到文本内容后存储到 QString 类型的 inputText 变量即可。

此时已经获取到了对应的输入框内容,那么接下来需要把对应输入框的文本设置到 pushButton 之上即可,设置一个控件的文本也需要使用 ui 指定到某一个控件,那么获取 PushButton 控件代码则是 ui->pushButton,那么设置文本则是 setText 方法,在 setText 方法中传入对应的文本值即可,所以最终代码写成 ui->pushButton->setText(inputText);,当然你可以直接写成 ui->pushButton->setText(ui->lineEdit->text());

此时完成了代码编写后,我们可以运行程序,运行成功将会出现一个窗体界面,此时在窗体界面中输入 233:

在这里插入图片描述

接着点击 PushButton 按钮,点击后 PushButton 按钮的文本将会改变成你所输入的值:

在这里插入图片描述

3.2 自定义信号与槽

信号与槽不止可以通过默认方式进行生成和编写,还可以通过自定义的方式自定义信号与指定处理的槽函数。

我们自定义的信号与槽是通过 connect 函数进行设置,例如如下代码:

connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(on_pushButton_clicked()));

以上代码中 connect 函数接收的第一参数为你需要指定信号与槽的控件,第二个参数则是表示发送什么信号,就像我们在设计窗口中右键某一个控件,随后通过鼠标点击指定对应的信号;在这里 SIGNAL(returnPressed()) 中 SIGNAL 表示是一个宏函数,需要传入对应的事件,其 returnPressed 则表示是 enter 按下确认的事件,接下来的 this 则是表示当前类处理这个信号,最后一个则是槽,SLOT 需要传入对应处理信号的函数即可。

由于自定义信号与槽的方式有很多种,在这里先简单讲解一种,之后其他的处理方式将会补充讲解。

最后我们点击运行,随后在 lineEdit 中输入对应的文本,enter 键后按钮也会发生其文本的改变:

在这里插入图片描述

四、实现简单四则计算器

4.1 界面设计

在这一节中,我们使用 qt 制作一个简单的四则运算器,学习一下界面创建与修饰。

首先创建好项目,其次打开 ui 文件,进入到设计窗口之中:

在这里插入图片描述
在一个计算机中,数字的按键是必不可少的,我们拖动对应的按钮到设计窗口之上,最后点击按钮,在右下角的属性设置之上改变其宽高:

在这里插入图片描述

接着我们更改文本后,按住键盘 ctrl 拖动控件,将会直接复制出一个新的控件:

在这里插入图片描述

接着我们拖动出多个对应的按钮,并且更改其文本:

在这里插入图片描述

此时我们发现这些按钮的排列并不整齐,我们可以选中所有的按钮,接着点击设计窗口顶部的栅格布局:

在这里插入图片描述
点击之后整个按钮将会自动进行规整的排列。

接着,我们点击右上角,给每一个按钮起名,方便我们接下来的调用:

在这里插入图片描述

接着我们添加两个 eidt 到窗口之上,并且设置号大小和位置:

在这里插入图片描述

当然也要更好对应的控件名,一个用于显示公式,还有一个用于显示最终的计算结果:

在这里插入图片描述
接着设置整个窗体大小的宽高:

在这里插入图片描述
设置完毕后我们可以给这些控件对应的样式。

4.2 添加样式

首先我们可以给这些控件设置边框为 none 去掉对应的边框,主要是把 edit 的边框去掉使其较为美观。右键在右上角的对象树上,选择改变样式:

在这里插入图片描述

接着在弹出来的样式表上添加样式修饰:

在这里插入图片描述

*{border:none;background-color: rgb(234, 234, 234);
}

其中 * 表示给所有的对象设置样式,其样式编写在 * 之后的花括号之中,border 设置为 none 表示边框为 none 则表示不需要边框,background-color 表示设置对应的背景色,用 rgb 色进行设置。输入完毕后点击应用,当前的窗体如下:

在这里插入图片描述
接着我们可以设置对应的 按钮样式,例如设置 QPushButton 的背景色以及对应的字体大小、是否加粗以及字体,可以使用以下样式:

QPushButton{background-color: rgb(255, 255, 255);font:bold 11pt '微软雅黑';
}

在这里插入图片描述

font:bold 11pt '微软雅黑'; 表示设置字体,bold 表示字体加粗,11pt 表示字体的大小、最后则是对应的字体。

若此时我想对应的设置乘号、除号、加号、减号这些运算符号的不同,则可以通过样式指定控件设置不一样的样式,例如:

在这里插入图片描述

QPushButton#add,#subtraction,#division,#multiplication{background-color: rgb(56, 208, 203);
}

此时设置样式则需要先指定某个类型的组件,随后使用 # 在末尾街上控件名称,随后逗号分隔即可指定某个控件设置样式。

此时运行程序,我们发现鼠标移动到某个按钮上时没有任何反应,若想使按钮有反应则需要对应的设置 hover 时按钮的样式,hover 则是指对应的鼠标悬浮上去后,按钮发生的改变,设置这个样式很简单,只需要指定某个类型的控件后,在其后使用一个冒号 :hover 即可指定一个样式,例如:

QPushButton:hover{background-color: rgb(221, 221, 221);border:1px solid rgb(185, 185, 185);
}

在这里插入图片描述

此样式表示当鼠标移动上去后改变其对应的背景色以及边框颜色,此时鼠标移动上去将会使按钮有反应,并不会过于死板。

此时效果如下:

在这里插入图片描述

但此时我们发现,设置过指定控件的样式例如加减乘除并没有移动上去后发生样式改变,这时需要再针对这些控件设置一下 hover 样式:

QPushButton#add:hover,#subtraction:hover,#division:hover,#multiplication:hover{background-color: rgb(221, 221, 221);border:1px solid rgb(185, 185, 185);
}

效果如下:

在这里插入图片描述

4.3 功能设计

设计功能我们需要设置一个全局变量用于记录通过按钮生成的四则运算公式,在此我们设置在头文件之中:

在这里插入图片描述
接着我们给每个按钮手动设置一个槽函数:

在这里插入图片描述
首先我们设置数字 7 按钮的槽函数:

void MainWindow::on_btn7_clicked()
{expression+="7";ui->show->setText(expression);
}

在这里插入图片描述

在这个槽函数中设置 expression 全局变量记录用户输入了7,随后设置 show edit 的文本为 expression;既然 expression 是用于对应的记录公式,那么我们就可以把所有的数字都设置类似于数字 7 的形式往 expression 中添加对应的拼接,并且加减乘除法按钮也要完成该操作:

在这里插入图片描述

最后运行一下程序,发现输入点击对应按钮后将会出现对应的公式:

在这里插入图片描述
但是我们发现由于是 eidt 对象,可以用户输入,我们可以设置其 edit 的属性 readonly 为 true 即可:

在这里插入图片描述
也可以设置对应的水平对齐为右:

在这里插入图片描述
最后我们得到了这个公式,我们只需要通过计算器代码即可求出对应值,由于这是 C/C++ 的内容在此就不再赘述,我们此时直接右键等于号,设置其槽函数,并且赋值以下代码即可(代码来源于网络):

 QStack <int> OPND;  // Operand stackQStack <char> OPTR;  // Operator stackOPTR.push('#');//char ss[2]="#";//尾部有\0char s[maxn];char path[50];QString str = expression;QByteArray ba = str.toLocal8Bit();memcpy(s,ba.data(),ba.size()+1);//加1是为了最后的终结符,否则转换回来的时候不知道什么时候截止QString str2;str2 = QString::fromLocal8Bit(s);strcat(s,ss);// 运算式尾部加 "#"--结束运算符char c=s[0];int k=1;while(c!='#'||OPTR.top()!='#'){  //表达式未读完或者运算未完int y=0;if(c>='0'&&c<='9'){while(c>='0'&&c<='9'){  // 读入连续的数字y=y*10+(c-'0');c=s[k++];}OPND.push(y);  // 把读进的数字入数字栈}else{switch(Procede(OPTR.top(),c)){case'<':  //栈顶元素优先权低OPTR.push(c);c=s[k++];break;case'=':OPTR.pop();  // 脱括号c=s[k++];  // 读入下一个字符break;case'>':  //退栈并将运算结果入栈char x=OPTR.top();OPTR.pop();int m=OPND.top();OPND.pop();int n=OPND.top();OPND.pop();OPND.push(Operate(m,n,x));break;}}}ui->res->setText(QString::number(OPND.top()));

当然,你直接复制这个代码将会报错,此时需要再复制几个函数以及添加头文件,先复制几个函数:

const int maxn=110;
char priority[7][7]={{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','0'},   // 此行"("=")"表示左右括号相遇,括号内运算已完成{'>','>','>','>','0','>','>'},{'<','<','<','<','<','0','='}    // "=" 表示整个表达式求值完毕};                               //  "0"表示不可能出现这种情况 ( 语法错误 )//Precede 用于判断运算符栈栈顶运算符 a1 与读入运算符 a2 之间的优先关系函数
char Procede(char a,char b){   // 建立 pre[][] 到 运算符间的映射关系int i,j;switch(a){case'+':i=0;break;case'-':i=1;break;case'*':i=2;break;case'/':i=3;break;case'(':i=4;break;case')':i=5;break;case'#':i=6;break;   // # 是表达式的结束符}switch(b){case'+':j=0;break;case'-':j=1;break;case'*':j=2;break;case'/':j=3;break;case'(':j=4;break;case')':j=5;break;case'#':j=6;break;}return priority[i][j];
}int Operate(int m,int n,char x){if(x=='+')return m+n;if(x=='-')return n-m;if(x=='*')return m*n;if(x=='/')return n/m;
}

随后需要对应的添加一个头文件 QStack:

#include <QStack>

最后若你的命名跟我的不符,你需要修改字符串转字符数组时的公式变量命名:

在这里插入图片描述

以及最后显示值时指定改变某个控件:

在这里插入图片描述

最终结果如下:

在这里插入图片描述

总结

本章节主要介绍了 qt 的一些基本信息,并且使用 qt 创建一个基本的项目,了解 qt 项目创建的基本流程;在此基础上学习了信号与槽,并且使用了对应的小示例改变了按钮的文本,在基础信号与槽的基础上,通过 connect 实现了自定义的信号与槽指定,完成了使用键盘响应对应的槽函数;最后通过学习如何制作一个简单的四则运算程序,在其中了解了 UI 界面的布局制作、限制其大小、以及设置对应的样式,最终也实现了对应的按钮及计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS C#语言获取输入名称的汉语拼音简拼码和全拼码完整案例教程

结果预览: 扩展阅读: SQL语言获取拼音码:SQL Server编写函数获取汉字的拼音码(简拼) 文章目录 1. 拼音码类编写2. 界面设计3. 前端调用4. 结果展示1. 拼音码类编写 打开Visual Studio,新建一个Winform项目,再添加一个类文件,命名为PYM。 键入如下代码: using Syst…

iOS duplicate symbol for architecture arm64 解决办法

导致这个问题的原因有多种&#xff1a; 1.重复定义了const常量。 2.多个第三方库同时用到了某个函数库。 暂时列举这几种&#xff0c;以后遇到了其他原因再加。转载于:https://www.cnblogs.com/zhanglinfeng/p/5987077.html

WPF 实现星空效果

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;普通的地球人原文地址&#xff1a;https://www.cnblogs.com/tsliwei/p/6282183.htmlGithub地址&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers效果前阵子看到ay的蜘蛛网效…

data类型的Url的格式

data类型的Url的格式 一、data类型的简介 所谓"data"类型的Url格式&#xff0c;是在RFC2397中提出的&#xff0c;目的对于一些“小”的数据&#xff0c;可以在网页中直接嵌入&#xff0c;而不是从外部文件载入。例如对于img这个Tag&#xff0c;哪怕 这个图片非常非…

C语言试题八十之统计单词个数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 终端输入一…

SSIS 执行变量中的脚步输出列顺序与SQL查询列顺序不同

这个问题是朋友遇到的&#xff0c;做一个SSIS的程序将数据导入到txt。然后再用Oracle的工具导入到Oracle。但是在SSIS中执行变量脚步的时候&#xff0c;发现输出的列名称跟查询的列名称完全不同。比如Schema_id在查询的第三列&#xff0c;但是输出的时候到了第6列。 如图&#…

【ArcGIS风暴】ArcGIS自定义坐标系统案例教程---以阿尔伯斯投影(Albers)为例

在实际工作中,经常需要进行矢量数据或栅格数据的投影转换工作,但有时候ArcGIS中恰恰没有我们需要的坐标系,此时,就需要我们自定义坐标系。本文以阿尔伯斯投影(Albers)为例,讲解自定义投影的一般过程及注意事项。 文章目录 1. 确定投影名称2. 选择投影坐标系及修改参数4.…

C语言试题八十一之利用递归函数调用方式,将所输入的5个字符,相反顺序打印

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 利用递归函…

Unity5 GI与PBS渲染从用法到着色代码

本文主要介绍Untiy5以后的GI&#xff0c;PBS&#xff0c;以及光源探头&#xff0c;反射探头的用法以及在着色器代码中如何发挥作用&#xff0c;GI是如何影响渲染的&#xff0c;主要分成三个部分&#xff0c;最开始说明PBS需要的材质与相应概念&#xff0c;二是Unity 里相应GI的…

Web前端笔试面试题汇总(转自github)

前言 本文总结了一些优质的前端面试题&#xff08;多数源于网络&#xff09;&#xff0c;初学者阅后也要用心钻研其中的原理&#xff0c;重要知识需要系统学习&#xff0c;透彻学习&#xff0c;形成自己的知识链。万不可投机取巧&#xff0c;只求面试过关是错误的&#xff01; …

Blazor University (31)表单 —— 验证

原文链接&#xff1a;https://blazor-university.com/forms/validation/验证源代码[1]DataAnnotationsValidator 是 Blazor 中的标准验证器类型。在 EditForm 组件中添加此组件将启用基于 System.ComponentModel.DataAnnotations.ValidationAttribute 的 .NET 属性的表单验证。…

CSDN,CNBLOGS博客文章一键转载插件 终于更新了!

之前&#xff0c;Shawn Chou等朋友一直建议插件支持cnblogs文章转载&#xff0c;但一直没时间修改插件&#xff0c;今天晚上抽时间将插件进行了升级&#xff0c;可以支持 CSDN,CNBLOGS博客文章的一键转载。时间仓促&#xff0c;难免有各种问题&#xff0c;欢迎提出建议&#xf…

ROS2_Control官方资料+运动控制

Getting Started — ROS2_Control: Rolling Dec 2023 documentation Getting Started Edit on GitHub Youre reading the documentation for a development version. For the latest released version, please have a look at Iron. Getting Started Installation Binar…

三、教你搞懂渐变堆叠面积图《手把手教你 ECharts 数据可视化详解》

注&#xff1a;本系列教程需要对应 JavaScript 、html、css 基础&#xff0c;否则将会导致阅读时困难&#xff0c;本教程将会从 ECharts 的官方示例出发&#xff0c;详解每一个示例实现&#xff0c;从中学习 ECharts 。 ECharts 官方示例&#xff1a;https://echarts.apache.o…

C语言试题八十二之输入小写字母,把小写字母转换成大写字母。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 输入小写字…

Serv-U服务器的管理3

&#xff18;&#xff0e;编辑&#xff29;&#xff30;访问规则对于某些扰乱服务器秩序但又不方便删除其账户的用户&#xff0c;可以利用“编辑&#xff29;&#xff30;访问规则”允许或阻止特定的&#xff29;&#xff30;访问。&#xff33;&#xff45;&#xff52;&#…

【ArcGIS风暴】什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘

摄影测量Pix4d等软件,或激光雷达数据一般都是LAS格式的点云数据,有很大的适用范围和优点,那么,到底什么是LAS数据集呢,一文告诉你LAS数据集的来龙去脉。 扩展阅读: 什么是点云?什么是Las数据集?一篇文章告诉你点云数据的奥秘 ArcGIS+CASS点云(.las)数据生成等高线方法案…

试用了多款报表工具,终于找到了基于.Net 6开发的一个了

Part1前言上一个月有一个项目需要用到数据分析&#xff0c;将老板感兴趣的数据给他整理成一个面板&#xff0c;方便他实时查看&#xff0c;于是自己了解到了BI,当时我们项目就用了metabase&#xff0c;metabase是一款开源的BI分析工具&#xff0c;开发语言clojureReact为主。就…

4种CSS文字竖排方法

2019独角兽企业重金招聘Python工程师标准>>> 有时候&#xff0c;我们需要对网页某个区域的文字竖排&#xff0c;竖向排列&#xff0c;横向的当然大家都见惯了&#xff0c;对于竖排&#xff0c;一时间找不到思路了&#xff0c;呵呵&#xff0c;其实和横排一样简单&am…

知道这20个正则表达式,能让你少写1,000行代码

正则表达式&#xff0c;一个十分古老而又强大的文本处理工具&#xff0c;仅仅用一段非常简短的表达式语句&#xff0c;便能够快速实现一个非常复杂的业务逻辑。熟练地掌握正则表达式的话&#xff0c;能够使你的开发效率得到极大的提升。 正则表达式经常被用于字段或任意字符串的…