winForm基础(二)
MD5加密
//创建MD5对象
MD5 md5 = MD5.Create();
//开始加密
//需要将字符处转换成字节数组
byte[] buffer = Encoding.GetEncoding("GBK").GetBytes(str);
//返回一个加密好的字节数组
byte[] MD5Buffer = md5.ComputeHash(buffer);
//将字节数组转换成字符串
//字节数组--->字符串
//1将字节数组中每个元素按照指定的编码格式解析成字符串 //return Encoding.GetEncoding("GBK").GetString(MD5Buffer);
//2直接将数组ToString();
//3将字节数组中的每个元素ToString()
// 189 273 345 我爱你
// 189 273 345
string strNew = "";
for (int i = 0; i < MD5Buffer.Length; i++)
{
// 把十进制转换为16进制
strNew += MD5Buffer[i].ToString("x2");
}
return strNew;
事件
指发生一件事情。
注册事件:双击控件注册的都是控件默认被选中的那个事件。
触发事件: 当被触发的时候发生的事件
PLUS : 在Main函数当中创建的窗体对象,我们称之为这个窗体应用程序的主窗体。
也就意味着,当你将主窗体关闭后,整个应用程序都关闭了。
TextBox控件
WordWrap:指示文本框是否换行。
PasswordChar:让文本框显示一个单一的字符
ScollBars:是否显示滚动条
事件:TextChanged 当文本框中的内容发生改变的时候触发这个事件。
Timer组件
单选和多选
checked:指示这个控件是否处于选中状态。
默认情况下,在一个窗体中,所有的单选按钮只允许选中一个,可以使用groupbox进行分组。
winForm基础(一)
MDI窗体的设计
1、首先确定一个父窗体。 将IsMdiContainer设置为true。
2、创建子窗体,并且设置他们的父窗体。
Directory 操作文件夹
CreateDirectory 创建文件夹
Delete 删除文件夹
Move 剪切文件夹
Exist 判断是否存在
GetFiles 获得指定的目录下所有文件的全路径
GetDirectory 获得指定目录下所有文件夹的全路径
//创建文件夹
Directory.CreateDirectory(@"C:\a");
Console.WriteLine("创建成功");
Console.ReadKey();
//删除文件夹
Directory.Delete(@"C:\a",true);
Console.WriteLine("删除成功");
Console.ReadKey();
//剪切文件夹
Directory.Move(@"c:\a", @"C:\Users\SpringRain\Desktop\new");
Console.WriteLine("剪切成功");
Console.ReadKey();
//获得指定文件夹下所有文件的全路径
string[] path = Directory.GetFiles(@"C:\Users\SpringRain\Desktop\Picture","*.jpg");
for (int i = 0; i < path.Length; i++)
{
Console.WriteLine(path[i]);
}
Console.ReadKey();
//获得指定目录下所有文件夹的全路径
string[] path = Directory.GetDirectories(@"C:\Users\SpringRain\Desktop\new");
for (int i = 0; i < path.Length; i++)
{
Console.WriteLine(path[i]);
}
Console.ReadKey();
//判断指定的文件夹是否存在
if (Directory.Exists(@"C:\a\b"))
{
for (int i = 0; i < 100; i++)
{
Directory.CreateDirectory(@"C:\a\b\" + i);
}
}
Console.WriteLine("OK");
Console.ReadKey();
MessageBox.Show的用法
MessageBox.Show()的各种用法
【函数】 <整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon);
【函数说明】 弹出一个消息框。
【语法】
参数:
Text <字符串>,消息框的正文;
Title <字符串>,消息框的标题;
nType <整型>,消息框的类型。
返回值:<整型>,用户在消息框上点击关闭时的选择的按钮。 MessageBoxIcon:对话框上显示的图标样式。
【说明】全部都是MessageBox.Show();切记
Show("消息内容", "返回值 确定1",MessageBoxButtons.OK,MessageBoxIcon.Question);
Show("消息内容",, "返回值 确定1 取消2",MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
Show("消息内容", "返回值 终止3 重试4 忽略5",MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);
Show("消息内容", "返回值 是6 否7 取消2",MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
Show("消息内容", "返回值 是6 否7",MessageBoxButtons.YesNo, MessageBoxIcon.Hand);
Show("消息内容", "返回值 重试4 取消2",MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
MessageBoxIcon: 所有图标样式
MessageBoxIcon.Question
MessageBoxIcon.Asterisk
MessageBoxIcon.Information
MessageBoxIcon.Error
MessageBoxIcon.Stop
MessageBoxIcon.Hand
MessageBoxIcon.Exclamation
MessageBoxIcon.Warning
MessageBoxIcon.None
打开文件or文件夹
//点击弹出对话框
OpenFileDialog ofd = new OpenFileDialog();
//设置对话框的标题
ofd.Title = "请选择要打开的文本文件哟亲 O(∩_∩)O~";
//设置对话框可以多选
ofd.Multiselect = true;
//设置对话框的初始目录
ofd.InitialDirectory = @"C:\Users\SpringRain\Desktop";
//设置对话框的文件类型
ofd.Filter = "文本文件|*.txt|媒体文件|*.wmv|图片文件|*.jpg|所有文件|*.*";
//展示对话框
ofd.ShowDialog();
//获得在打开对话框中选中文件的路径
string path = ofd.FileName;
if (path == "")
{
return;
}
using (FileStream fsRead = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read))
{
byte[] buffer = new byte[1024 * 1024 * 5];
//实际读取到的字节数
int r = fsRead.Read(buffer, 0, buffer.Length);
textBox1.Text = Encoding.Default.GetString(buffer, 0, r);
}
//--------------------------------------------------------------------------
//打开文件夹
string path = null;
FolderBrowserDialog dilog = new FolderBrowserDialog();
dilog.Description = "请选择文件夹";
if (dilog.ShowDialog() == DialogResult.OK || dilog.ShowDialog() == DialogResult.Yes)
{
path = dilog.SelectedPath;
}
if (!string.IsNullOrEmpty(path))
{
System.Diagnostics.Process.Start("Explorer.exe", path);
}
else
{
MessageBox.Show("请选择路径");
}
保存文件
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "请选择要保存的路径";
sfd.InitialDirectory = @"C:\Users\SpringRain\Desktop";
sfd.Filter = "文本文件|*.txt|所有文件|*.*";
sfd.ShowDialog();
//获得保存文件的路径
string path = sfd.FileName;
if (path == "")
{
return;
}
using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = Encoding.Default.GetBytes(textBox1.Text);
fsWrite.Write(buffer, 0, buffer.Length);
}
MessageBox.Show("保存成功");
字体和颜色
//字体
FontDialog fd = new FontDialog();
fd.ShowDialog();
textBox1.Font = fd.Font;
//颜色
ColorDialog cd = new ColorDialog();
cd.ShowDialog();
textBox1.ForeColor = cd.Color;
process进程
通过进程打开一些应用程序
Process.Start("calc");
Process.Start("mspaint");
Process.Start("notepad");
Process.Start("iexplore", "http://www.baidu.com");
获得当前程序中所有正在运行的进程
Process[] pros = Process.GetProcesses();
foreach (var item in pros)
{
//不试的不是爷们
//item.Kill();
Console.WriteLine(item);
}
//通过一个进程打开指定的文件
ProcessStartInfo psi = new ProcessStartInfo(@"C:\Users\SpringRain\Desktop\1.exe");
//第一:创建进程对象
Process p = new Process();
p.StartInfo = psi;
p.Start();
// p.star
thread线程
前台线程:只有 所有的前台线程都关闭了才能完成程序的关闭。
后线线程:只要所有的前台线程结束,后台线程自动结束。
//创建一个线程去执行这个方法
th = new Thread(Test);
//标记这个线程准备就绪了,可以随时被执行。具体什么时候执行这个线程,
//由cpu决定
//将线程设置为后台线程 默认为前台线程
//是后台线程吗 IsBackground
th.IsBackground = true;
th.Start();
th.Abort();
th.Start();
//取消跨线程的访问
Control.CheckForIllegalCrossThreadCalls = false;
在.Net下,是不允许跨线程的访问。
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(Test);
th.IsBackground = true;
th.Start("123"); //在这里传参
//Test();
}
//线程传参
private void Test(object s) //必须是object
{
string ss = (string)s;
for (int i = 0; i < 10000; i++)
{
Console.WriteLine(i);
}
}
//url转码
string str = "https://back-u.cos.ap-guangzhou.myqcloud.com/%E7%99%BD%E9%87%91%E3%83%87%E3%82%A3%E3%82%B9%E3%82%B3%20-%20%E4%BA%95%E5%8F%A3%E8%A3%95%E9%A6%99.flac";
str = System.Web.HttpUtility.UrlDecode(str);
Console.WriteLine(str);
HTML和CSS
html
1、首先在桌面上随便的建一个文件。
2、将创建的文件的名称改为.htm /.html
3、开始写基本的框架标签
HTML中的标签
p标签: 段落标签
 : 空格
h#: 标题标签
<!--要注释的内容-->:注释符
<img/>: 图片标签,用来显示图片。
src: 表示要显示的图片的路径
heigth: 图片的高度 px
width:图片宽度 px
alt:当图片由于某些原因显示失败的时候所显示的文本
title:当光标移动到图片上的时候显示的文本
<hr/>: 分割线
<font></font>: 字体标签 size =1 ~7 7最大 color:颜色 face:字体系列
a标签:超链接 href表示要连接到的地址 target:打开新网页的方式 _blank表示打开一个新网页进行跳转。
_self 表示在当前页面进行跳转。
实现页面内部的跳转
实现页面间的跳转
发送邮件
<b> 定义粗体文本
<i> 定义斜体
<tt> 定义打字机文本(等宽)
<u> 定义下划线文本
<sup><sub> 定义上下标
<s> 定义加删除线的文本
<html>
<head>
<title> this is my first html </title>
</head>
<body>
<a name="顶端" href="#底端"> 回到底端</a>
<p>aasdddasda</p>
<p>aasdddasda</p>
<h1> 标题1 </h1>
<a href="https://www.xiaodaizhi.com" target="_blank">花纸<a/>
<img src = "https://h.ap-guangzhou.myqcloud.com/wp-content/uploads/2020/07/71089840_p1.jpg" width="800px" height="600px" border = "1" alt="喜欢啊" title="还行"/>
<br/>
<hr/>
文字size 1 - 7<br/>
<br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/>
<br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/><br/>啊啊啊啊我是<font size = "7" color = "blue">猪</font>
<br/>
<a name="底端" href="#顶端"> 回到顶端</a>
</body>
</html>
css
介绍
CSS是Cascading Style Sheet这个几个英文单词的缩写,翻译成中文是“层叠样式表”的意思。CSS能让网页制作者有效的定制、改善网页的效果。CSS是对HTML的补充,网页设计师曾经为无法很好的控制网页的显示效果而倍感苦恼,CSS的出现解决了这个问题。
Css实现了网页内容和页面效果的彻底分离。
Ctrl+j 弹出智能提示的快捷键
CSS的几种设置方式
(你可以通过怎样的方式向HTML页面中写入CSS代码)
有三种方式可以将样式表加入到HTML文档中,每种方式都有自己的优缺点,这三种方式是:
内联样式表(在标签内设置元素的样式)
嵌入样式表(需要在head标签内写)
外部样式表 link
内联样式表缺点:如果要将同样的样式风格设置到网页中所有的段落上,就需要对每个
标签都进行重复的设置。
嵌入样式表缺点:如果要为整个网站定义通用的的样式风格,也就是同样的样式风格要被应用到很多网页时,使用嵌入样式表,则需要在每个标签中都加入同样的代码段。为了解决这个问题,我们可以使用外部样式表
样式规则的选择器
(通过怎样的途径来获得页面上要设置样式的元素)
1)、HTML Selector
2)、Class Selector (需要给要设置样式的元素的class属性赋值)
3)、ID Selector (需要给要设置样式的元素的id属性赋值)
4)、关联选择器 P EM{background-Color:Yellow}
5)、组合选择器
6)、伪元素选择器
伪元素选择器是指对同一个HTML元素的各种状态和其所包括的部分内容的一种定义方式。例如,对于超链接标签()的正常状态(没有任何动作前)、访问过的状态、选中状态、光标移到超链接文本上的状态,对于段落的首字母和首行,都可以使用伪元素选择器来定义。
目前常用的伪元素有以下几种:
A:active 选中超链接时的状态
A:hover 光标移动到超链接上的状态
A:link 超链接的正常状态
A:visited 访问过的超链接状态
P:first-line 段落中的第一行文本
P:first-letter 段落中的第一个字母
CSS当中的样式属性详解
Css当中的属性非常多,大体上可以分为以下几类:字体、背景、文本、位置、布局、边缘、列表。
1)、字体
字体的属性主要包括文字的字体、大小、颜色、显示效果等基本样式,下面是各种字体属性的详细介绍。
Font-family:该属性用于设置字体系列。
Font-size:该属性定义文字的大小,可以使用度量单位来设置字体的大小,也可以使用一个相对的字体大小。还可以使用绝对的大小标记符。
绝对大小的设置为 xx-small、x-small、small、medium、large、x-large、xx-large中的任意一个。Xx-small为最小,xx-large为最大。
font-style
该属性用于定义字体样式为Normal、Italic或者Oblique(斜体)。
text-decoration
该属性用于在文本中条件下划线、上划线、中划线、闪烁效果。
font-weight
该属性用于设置粗体字的磅值
该属性的值有:normal、bold、bolder、lighter、100~900
2)背景
背景包括背景颜色、背景图像、以及背景图像的控制。
Background-color:设置背景色,transparent表示透明的背景色。
Background-image:设置元素的背景图像
Background-repeat:确定背景图像是否以及如何重复。
这个属性的取值no-repeat:表示背景图像只在元素的显示区域中出现一遍。
Repeat:在水平和垂直方向上垂直。
Repeat-x和Repeat-y分别在水平或者垂直方向上重复
Background-attachment:确定背景图像是否跟随内容滚动,
设置为fixed时,表示固定背景图像,为scroll时,表示图像跟随内容的移动而移动。
Background-position:指定背景图像的水平位置和垂直位置。水平位置的取值可以是left、center、right。也可以是数值。
垂直的取值可以是top、center、bottom。也可以是数值。
文档流
3)文本
文本的属性包括:文字间距、对齐方式、上标、下标、排列方式、首行缩进。
Word-spacing:设置单词之间的间距。
Letter-spacing:设置字符之间的间距
Text-align:设置文本的水平对齐方式,取值可以是left、right、center、justfy
Text-indent:设置第一行文本的缩进值
Line-height:设置文本所在行的行高。
文档流
4)位置
位置属性就是制定元素的位置。
Position:设置对象的定位方式。有三种取值:absolute(绝对定位)、relative(相对定位)和static(无特殊定位)默认为static。
Left:设置元素左边的水平位置
Top:设置元素顶部的垂直位置
Width:设置元素显示的宽度
Height:设置元素显示的高度
Z-index:使用定位后,
5、边缘
Margin类用于设置元素的边界与其他元素的空隙大小。
Margin-top:设置元素的上边界和与其他元素之间的空隙大小。
Margin-right:设置元素的右边界与其他元素之间的空隙大小。
Margin-bottom:设置元素的下边界与其他元素之间的空隙大小。
Margin-left:设置元素的左边界与其他元素之间的空隙大小。
Margin:用作上面4个属性的略写。
Padding类属性用于设置元素边界与内部内容之间的空隙大小。
Padding-top:设置元素的上边界与内部内容之间的空隙大小
Padding-right:设置元素的右边界于内部内容之间的空隙大小。
Padding-bottom:设置元素的下边界与内容之间的空隙大小。
Padding-left:设置元素的左边界与内部内容之间的空隙大小。
Padding:用作上面4个属性的略写。
Width类属性用于设置元素边框的宽度。可以使用thin(细)、medium(中)、thick(粗)三个值中的一个。
Border-top-width:指定元素上边框的宽度。
Border-right-width:用于指定元素右边框的宽度
Border-left-width:用于指定元素左边框的宽度
Border-bottom-width:用于指定元素下边框的宽度
Border-width:用作对上面四个属性的略写。
Color属性用于设置元素边框的颜色
Border-top-color
Border-left-color
Border-bottom-color:
Border-right-color:
Border-color:用于上面四个属性的略写
Style类属性用于设置元素边框的样式。可以使之为none、dotted(点线)、dashed(虚线)、solid(实现)、double(双线)、groove(凹槽)、ridge(凸槽)、inset(凹边)、outset(凸边)。
布局:
Display:inline|block|none
基础复习
注释符
单行注释 // 注释单行代码
多行注释 /要注释内容/
文档注释 /// 注释类和方法
HTML <!–要注释的内容–>
CSS /要注释的内容/
命名规范
Camel骆驼命名规范:要求首单词的首字母小写,其余单词首字母大写,变量、字段
int age string name char gender string highSchool
int _chinese
Pascal:类或者方法 GetMax GetSum
面向对象的复习
封装 继承 多态
字段:存储数据,访问修饰符应该设置为private私有的
属性:保护字段,对字段的取值和赋值进行限定。
new关键字:1、在堆中开辟空间 2、在开辟的空间中创建对象 3、调用对象的构造函数
this关键字:1、代表当前类的对象 2、调用自己的构造函数
构造函数:初始化对象,当创建对象的时候,会调用构造函数。
对字段的保护方法:
1、get()
2、set()
3、构造函数
*return:
1、立即结束本次方法
2、在方法中返回要返回的值
继承复习
解决代码的冗余,实现多态,增加了代码的扩展性,便于维护。
1、单根性
2、传递性
子类并没有继承父类的构造函数,而是会默认调用父类那个无参数的构造函数。
如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类
那里继承过来的成员。但是父类永远都只能使用自己的成员,而不能使用子类的成员。
子类之间也不能互相使用对方的成员。
里氏转换
1、子类可以赋值给父类
2、如果父类中装的是子类对象,那么可以将这个父类转换为子类对象。
new关键字
访问修饰符
public:公开的,公共的
private:私有的,只能在当前类的内部访问,类中成员们,如果不加访问修饰符,默认就是private
procteced:受保护的,可以在当前类的内部访问,也可以在该类的子类中访问
internal:在当前项目中都可以访问。
protected internal:
能够修饰类的访问修饰符只有两个,internal和public
常用的关键字
this
1、当前类的对象
2、调用自己的构造函数
base
调用父类的成员
new
1、创建对象
2、隐藏父类的成员
virtual
标记一个方法是虚方法
abstract
抽象的
override
重写
interface
接口
partial
部分类
sealed
密封类:不允许被继承
return
1、在方法中返回要返回的值
2、立即结束本次方法
break
跳出当前循环
continue
结束本次循环,回到循环条件进行判断
static
静态的
struct
结构
enum
枚举
const
常量
字符串和集合
1、字符串的不可变性
2、字符串可以看做是char类型的只读数组
ArrayList
Hashtable
List
Dictionary
装箱或者拆箱
装箱:就是将值类型转换为引用类型
拆箱:就是将引用类型转换为值类型。
值类型:bool int double char struct enum decimal
引用类型:string 数组 集合 interface object 自定义类
拆箱或者装箱的两种类型必须具有继承关系
结构和类的区别
1、类当中写了一个新的构造函数之后,默认的无参数的就被干掉了。
但是在结构中,写了一个新的构造函数之后,默认的那个无参数的还在。
在结构的构造函数当中,必须给所有的字段赋值,这样也就限制了结构中最多
只能有两个构造函数,一个是默认的无参数的构造函数,一个是全参数的构造函数。
2、结构的new关键字只干了一件事儿,就是调用结构的构造函数。
3、结构不能继承于类,而类也不能继承于结构。
结构不具备面向对象的特征。
而类才是面向对象的产物。
4、如果不给结构创建对象的话,不允许调用结构中的非静态方法。
委托、XML
单例模式
1、将构造函数私有化
2、提供一个静态方法,返回一个对象。
3、创建一个单例
正则表达式
字符 | 描述 | |||
---|---|---|---|---|
\ | 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n ”匹配字符“n ”。“\n ”匹配一个换行符。串行“\\ ”匹配“\ ”而“\( ”则匹配“( ”。 |
|||
^ | 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n ”或“\r ”之后的位置。 |
|||
$ | 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n ”或“\r ”之前的位置。 |
|||
* | 匹配前面的子表达式零次或多次。例如,zo能匹配“z ”以及“zoo ”。等价于{0,}。 |
|||
+ | 匹配前面的子表达式一次或多次。例如,“zo+ ”能匹配“zo ”以及“zoo ”,但不能匹配“z ”。+等价于{1,}。 |
|||
? | 匹配前面的子表达式零次或一次。例如,“do(es)? ”可以匹配“does ”或“does ”中的“do ”。?等价于{0,1}。 |
|||
{n} | n是一个非负整数。匹配确定的n次。例如,“o{2} ”不能匹配“Bob ”中的“o ”,但是能匹配“food ”中的两个o。 |
|||
{n,} | n是一个非负整数。至少匹配n次。例如,“o{2,} ”不能匹配“Bob ”中的“o ”,但能匹配“foooood ”中的所有o。“o{1,} ”等价于“o+ ”。“o{0,} ”则等价于“o* ”。 |
|||
{n,m} | m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3} ”将匹配“fooooood ”中的前三个o。“o{0,1} ”等价于“o? ”。请注意在逗号和两个数之间不能有空格。 |
|||
? | 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo ”,“o+? ”将匹配单个“o ”,而“o+ ”将匹配所有“o ”。 |
|||
. | 匹配除“\ n ”之外的任何单个字符。要匹配包括“\ n ”在内的任何字符,请使用像“`(. |
\n)`”的模式。 | ||
(pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\( ”或“\) ”。 |
|||
(?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“`( | )”来组合一个模式的各个部分是很有用。例如“ industr(?:y |
ies)”就是一个比“ industry |
industries`”更简略的表达式。 |
(?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“`Windows(?=95 | 98 | NT | 2000)”能匹配“ Windows2000”中的“ Windows”,但不能匹配“ Windows3.1”中的“ Windows`”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“`Windows(?!95 | 98 | NT | 2000)”能匹配“ Windows3.1”中的“ Windows”,但不能匹配“ Windows2000”中的“ Windows`”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<=pattern) | 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“`(?<=95 | 98 | NT | 2000)Windows”能匹配“ 2000Windows”中的“ Windows”,但不能匹配“ 3.1Windows”中的“ Windows`”。 |
(?<!pattern) | 反向否定预查,与正向否定预查类拟,只是方向相反。例如“`(?<!95 | 98 | NT | 2000)Windows”能匹配“ 3.1Windows”中的“ Windows”,但不能匹配“ 2000Windows”中的“ Windows`”。 |
x|y | 匹配x或y。例如,“`z | food”能匹配“ z”或“ food”。“ (z |
f)ood”则匹配“ zood”或“ food`”。 |
|
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc] ”可以匹配“plain ”中的“a ”。 |
|||
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“[^abc] ”可以匹配“plain ”中的“p ”。 |
|||
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z] ”可以匹配“a ”到“z ”范围内的任意小写字母字符。 |
|||
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z] ”可以匹配任何不在“a ”到“z ”范围内的任意字符。 |
|||
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b ”可以匹配“never ”中的“er ”,但不能匹配“verb ”中的“er ”。 |
|||
\B | 匹配非单词边界。“er\B ”能匹配“verb ”中的“er ”,但不能匹配“never ”中的“er ”。 |
|||
\cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c ”字符。 |
|||
\d | 匹配一个数字字符。等价于[0-9]。 | |||
\D | 匹配一个非数字字符。等价于[^0-9]。 | |||
\f | 匹配一个换页符。等价于\x0c和\cL。 | |||
\n | 匹配一个换行符。等价于\x0a和\cJ。 | |||
\r | 匹配一个回车符。等价于\x0d和\cM。 | |||
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 | |||
\S | 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 | |||
\t | 匹配一个制表符。等价于\x09和\cI。 | |||
\v | 匹配一个垂直制表符。等价于\x0b和\cK。 | |||
\w | 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_] ”。 |
|||
\W | 匹配任何非单词字符。等价于“[^A-Za-z0-9_] ”。 |
|||
\xn | 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41 ”匹配“A ”。“\x041 ”则等价于“\x04&1 ”。正则表达式中可以使用ASCII编码。. |
|||
\num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1 ”匹配两个连续的相同字符。 |
|||
\n | 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 | |||
\nm | 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 | |||
\nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值_nm_l。 | |||
\un | 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。 |
常用正则表达式
用户名 | /^[a-z0-9_-]{3,16}$/ |
---|---|
密码 | /^[a-z0-9_-]{6,18}$/ |
十六进制值 | /^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
电子邮箱 | /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ /^[a-z\d]+(\.[a-z\d]+)*@(\da-z?)+(\.{1,2}[a-z]+)+$/ |
URL | /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-])\/?$/ |
IP 地址 | /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ /^(?:(?: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]?)$/ |
HTML 标签 | /^<([a-z]+)([^<]+)(?:>(.)<\/\1>|\s+\/>)$/ |
删除代码\\注释 | (?<!http:|\S)//.*$ |
Unicode编码中的汉字范围 | /^[\u2E80-\u9FFF]+$/ |
XML
XML: 可拓展的标记语言
可以用来购买数据
注意:
XML是严格区分大小写的。
XML标签也是成对出现的。
节点包含元素。XML文件必须且只能有一个根节点。
节点Node
元素Element
通过代码创建XML文档。
//通过代码来创建XML文档
//1、引用命名空间
//2、创建XML文档对象
XmlDocument doc = new XmlDocument();
//3、创建第一个行描述信息,并且添加到doc文档中
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(dec);
//4、创建根节点
XmlElement books = doc.CreateElement("Books");
//将根节点添加到文档中
doc.AppendChild(books);
//5、给根节点Books创建子节点
XmlElement book1 = doc.CreateElement("Book");
//将book添加到根节点
books.AppendChild(book1);
//6、给Book1添加子节点
XmlElement name1 = doc.CreateElement("Name");
name1.InnerText = "123";
book1.AppendChild(name1);
XmlElement price1 = doc.CreateElement("Price");
price1.InnerText = "10";
book1.AppendChild(price1);
XmlElement des1 = doc.CreateElement("Des");
des1.InnerText = "好看";
book1.AppendChild(des1);
XmlElement book2 = doc.CreateElement("Book");
books.AppendChild(book2);
XmlElement name2 = doc.CreateElement("Name");
name2.InnerText = "dddd";
book2.AppendChild(name2);
XmlElement price2= doc.CreateElement("Price");
price2.InnerText = "10";
book2.AppendChild(price2);
XmlElement des2 = doc.CreateElement("Des");
des2.InnerText = "好看";
book2.AppendChild(des2);
doc.Save("Books.xml");
Console.WriteLine("保存成功");
xml使用
//追加XML文档
XmlDocument doc = new XmlDocument();
XmlElement books;
if (File.Exists("Books.xml"))
{
//如果文件存在 加载XML
doc.Load("Books.xml");
//获得文件的根节点
books = doc.DocumentElement;
}
else
{
//如果文件不存在
//创建第一行
XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
doc.AppendChild(dec);
//创建根节点
books = doc.CreateElement("Books");
doc.AppendChild(books);
}
//5、给根节点Books创建子节点
XmlElement book1 = doc.CreateElement("Book");
//将book添加到根节点
books.AppendChild(book1);
//6、给Book1添加子节点
XmlElement name1 = doc.CreateElement("Name");
name1.InnerText = "c#开发大全";
book1.AppendChild(name1);
XmlElement price1 = doc.CreateElement("Price");
price1.InnerText = "110";
book1.AppendChild(price1);
XmlElement des1 = doc.CreateElement("Des");
des1.InnerText = "看不懂";
book1.AppendChild(des1);
doc.Save("Books.xml");
Console.WriteLine("保存成功");
Console.ReadKey();
//XmlDocument doc = new XmlDocument();
////加载要读取的XML
//doc.Load("Books.xml");
////获得根节点
//XmlElement books = doc.DocumentElement;
////获得子节点 返回节点的集合
//XmlNodeList xnl = books.ChildNodes;
//foreach (XmlNode item in xnl)
//{
// Console.WriteLine(item.InnerText);
//}
//Console.ReadKey();
//读取带属性的XML文档
//XmlDocument doc = new XmlDocument();
//doc.Load("Order.xml");
//Xpath
//XmlDocument doc = new XmlDocument();
//doc.Load("Order.xml");
//XmlNodeList xnl = doc.SelectNodes("/Order/Items/OrderItem");
//foreach (XmlNode node in xnl)
//{
// Console.WriteLine(node.Attributes["Name"].Value);
// Console.WriteLine(node.Attributes["Count"].Value);
//}
//Console.ReadKey();
//改变属性的值
//XmlDocument doc = new XmlDocument();
//doc.Load("Order.xml");
//XmlNode xn = doc.SelectSingleNode("/Order/Items/OrderItem[@Name='190']");
//xn.Attributes["Count"].Value = "200";
//xn.Attributes["Name"].Value = "颜世伟";
//doc.Save("Order.xml");
//Console.WriteLine("保存成功");
XmlDocument doc = new XmlDocument();
doc.Load("Order.xml");
XmlNode xn = doc.SelectSingleNode("/Order/Items");
xn.RemoveAll();
doc.Save("Order.xml");
Console.WriteLine("删除成功");
Console.ReadKey();
////获得文档的根节点
//XmlElement order = doc.DocumentElement;
//XmlNodeList xnl = order.ChildNodes;
//foreach (XmlNode item in xnl)
//{
// ////如果不是Items 就continue
// //if (item[])
// //{
// // continue;
// //}
// Console.WriteLine(item.Attributes["Name"].Value);
// Console.WriteLine(item.Attributes["Count"].Value);
//}
Console.ReadKey();
委托
1.为什么使用委托
将一个方法作为参数传递给另一个方法。
2.委托概念
委托所指向的函数必须跟委托具有相同的签名(参数和返回值)
3.匿名函数
当方法只执行一次的时候,可以使用
//lamda表达式 => goes to 去哪儿
DelSayHi del = (string name) => { Console.WriteLine(“你好” + name); };
4.泛型委托
public delegate int DelCompare<T>(T t1, T t2);
// public delegate int DelCompare(object o1, object o2);
class Program
{
static void Main(string[] args)
{
int[] nums = { 1, 2, 3, 4, 5 };
int max = GetMax<int>(nums, Compare1);
Console.WriteLine(max);
string[] names = { "abcdefg", "fdsfds", "fdsfdsfdsfdsfdsfdsfdsfsd" };
string max1 = GetMax<string>(names, (string s1, string s2) =>
{
return s1.Length - s2.Length;
});
Console.WriteLine(max1);
Console.ReadKey();
}
public static T GetMax<T>(T[] nums, DelCompare<T> del)
{
T max = nums[0];
for (int i = 0; i < nums.Length; i++)
{
//要传一个比较的方法
if (del(max, nums[i]) < 0)
{
max = nums[i];
}
}
return max;
}
public static int Compare1(int n1, int n2)
{
return n1 - n2;
}
相关资料
相关加密算法
WPF官方文档
WPF示例源码-github
bass.dll & base.net.dll 用户名和注册码
Email-Address : 2636485450@qq.com
Registration-Key : 2X122636170022
BassNet.Registration(“gozhushi@qq.com”, “2X152429150022”);//注册bass音频库
解决“在证书存储区中找不到清单签名证书”
这个问题似乎以前碰到过,不过记不太清了。
程序重新生成,提示错误:在证书存储区中找不到清单签名证书。
可能是之前部署的程序证书被我删掉了或是证书过期了,结果出现这个问题。解决方案如下:
方案1:右击项目属性—>签名—>为ClickOnce清单签名,将勾掉的选项去掉。
方案2:在签名中创建一个新的签名。
方案3:记事本打开相应的csproj文件,调整节点值。
以上解决方案任选其一,我选了方案一,简单嘛。重新生成,问题搞定!
C# 启动外部程序的几种方法
c# winform快捷键实现
WinForm窗口关闭的几种常用方法
C# Winform中 如何进行UrlEncode编码及解码
C#怎么选择文件夹
C#制作简单的本地音乐播放器(二)—— 显示歌词
bass相关
官网:http://www.un4seen.com/
简略使用方法:https://www.lagou.com/lgeduarticle/108311.html
BassFx 。BASS_FX_TempoCreate方法