【Javascript】字符串转换函数总览

字符串转数字,下面为大家介绍主要的三种方法
转换函数、强制类型转换、利用js变量弱类型转换


1. 转换函数:
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后

者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的

都是NaN(Not a Number)。
在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析

该字符串。parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字;如果不是,该方法将

返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样

的 测试。这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换

成数字。
例如,如果要把字符串 “1234blue “转换成整数,那么parseInt()将返回1234,因为当它

检测到字符b时,就会停止检测过程。字符串中包含的数字字面量会被正确转换为数字,因此 字符串

“0xA “会被正确转换为数字10。不过,字符串 “22.5 “将被转换成22,因为对于整数来说,小数点是无

效字符。一些示例如下:

parseInt(“1234blue”); //returns 1234
parseInt(“0xA”);

//returns 10
parseInt(“22.5”); //returns 22
parseInt(“blue”); //returns

NaN
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成

整数。基是由parseInt()方法的第二个参数指定的,所以要解析十六进制的值,需如下调用parseInt()

方法:
parseInt(“AF”, 16); //returns 175
当然,对二进制、八进制,甚至十进制(默

认模式),都可以这样调用parseInt()方法:
parseInt(“10”, 2); //returns 2

parseInt(“10”, 8); //returns 8
parseInt(“10”, 10); //returns 10
如果

十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
parseInt

(“010”); //returns 8
parseInt(“010”, 8); //returns 8
parseInt(“010”, 10);

//returns 10
在这段代码中,两行代码都把字符串 “010 “解析成了一个数字。第一行代码把这

个字符串看作八进制的值,解析它的方式与第二行代码(声明基数为8)相同。最后一行代码声明基数为

10,所以iNum3最后等于10。
parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查

看每个字符,直到找到第一个非有效的字符为止,然后把该字 符之前的字符串转换成数字。不过,对于

这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的,

parseFloat()方法会把这个小数点之前的字符串转换成数字。这意味着字符串 “22.34.5 “将被解析成

22.34。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,而不能

用八进制形式或十六进制形式。该
方法会忽略前导0,所以八进制数0908将被解析为908。对于十六

进制数0xA,该方法将返回NaN,因为在浮点数中,x不是有效字符。此外,parseFloat()也没有基模式。

下面是使用parseFloat()方法的示例:
parseFloat(“1234blue”); //returns 1234.0

parseFloat(“0xA”); //returns NaN
parseFloat(“22.5”); //returns 22.5

parseFloat(“22.34.5”); //returns 22.34
parseFloat(“0908”); //returns 908

parseFloat(“blue”); //returns NaN
2. 强制类型转换

还可使用强制类

型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类

型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成

Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String

(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值

直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或

对象(下一节将讨论这一点)时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined

或null,它将返回false。
可以用下面的代码段测试Boolean型的强制类型转换。
Boolean(“”);

//false – empty string
Boolean(“hi”); //true – non-empty

string
Boolean(100); //true – non-zero number
Boolean(null); //false –

null
Boolean(0); //false – zero
Boolean(new Object()); //true –

object
Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的

是整个值,而不是部分值。还记 得吗,parseInt()和parseFloat()方法只转换第一个无效字符之前的字

符串,因此 “4.5.6 “将被转换为 “4.5 “。用Number()进行强制类型转换, “4.5.6 “将返回NaN,因为

整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number()将判断是调用parseInt()方法

还是调用 parseFloat()方法。下表说明了对不同的值调用Number()方法会发生的情况:
用  法

结  果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number

(null) 0
Number( “5.5 “) 5.5
Number( “56 “) 56
Number( “5.6.7 “)

NaN
Number(new Object()) NaN
Number(100) 100
最后一种强制类型转换方法String

()是最简单的,因为它可把任何值转换成字符串。要执行这种强制类型转换,只需要调用作为参数传递

进来的值的 toString()方法,即把1转换成 “1 “,把true转换成 “true “,把false转换成 “false ”

,依此类推。强制转换成字符串和调用toString()方法的唯一不同之处在于,对null或undefined值强制

类型转换可以生成字符串而不引 发错误:
var s1 = String(null); //”null”
var

oNull = null;
var s2 = oNull.toString(); //won’t work, causes an

error
3. 利用js变量弱类型转换

举个小例子,一看,就会明白了。


上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串

到数字的类型转换,不过这个方法还是不推荐的。

【c++】 vc6.0 sdk

微软已经不再对 VC6 支持了,最新的 SDK 已经不能在 VC6 上使用。但是还是可以找到支持 VC6 的最后两个版本:
For Server2003 3790.0 RTM: Size (bytes): 342,000,000 Last Updated: February 2003
For XPSP2 2600.2180 RTM: Size (bytes): 266,000,000 Last Updated: August 2004

在这里感谢网友发现的下载地址:

Platform SDK XP-SP2:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/XPSP2FULLInstall.htm
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.1.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.2.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.3.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.4.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.5.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.6.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.7.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.8.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.9.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.10.cab
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/Extract.exe
http://download.microsoft.com/download/platformsdk/sdk/update/WIN98MeXP/EN-US/2600.2180/FULL/PSDK-FULL.bat
Platform SDK February 2003:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.1.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.2.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.3.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.4.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.5.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.6.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.7.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.8.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.9.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.10.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.11.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.12.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.13.cab
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/PSDK-FULL.bat
http://download.microsoft.com/download/platformsdk/sdk/update/win98mexp/en-us/3790.0/FULL/Extract.exe

 

 

【C#】应用IHTMLDocument2编程实现网页表单数据的自动提交

MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素.MSHTML对象模型是由一些对象和集合组成的.处于根部的是HTML,描述了打开页面的1个窗口,包括一系列集合和对象。如Frames集合,History,Location,Navigator,Document,Vi—sum,Event对象等.其中描述呈现在客户窗口实际网页的是Document对象。由一系列的属性、方法、对象和集合组成.其中All集合中包含网页中所有标记(Tag)元素,其主要的方法和属性有:
(1)Length(长度):即标记出现的个数,可以把标记的集合理解为从0开始的一维数组,其次序按照标记在网页位置排列;
(2)Tags(标记):用于过滤出给定标记的集合,如Doc.Al1.Tags(P)得到所有分段标记P;
(3)Item(项目):用于选择集合中的某1个元素,如object.item(0)得到集合的第1个元素,而object.item(i)得到第i+1个元素.
此外,IHTMLElement也是个常用的集合对象,代表网页中指定标记的集合,通过这个集合对象,可以得到网页上特定标记的内容.IHTMLElement有4个主要属性:
(1)InnerText:开始标记和结束标记之间的文本;
(2)InnerHTML:开始标记和结束标记之间的文本和HTML;
(3)OuterText:对象的文本;
(4)OuterHTML:对象的文本和HTML.

C# 实现基本思路为:使用从CDHtmlDialog或者CHtmlView继承的类来创建一个浏览器窗口,并打开你指定的URL。
在DocumentComplete事件(虚函数)中获得浏览器容器的IHTMLDocument2接口(文档接口)。
从文档接口中扫描DOM树,寻找你希望的FORM元素。
扫描FORM中的各个IHTMLInputElement,如果是你希望赋值的,就执行IHTMLInputElement::put_Value()赋值。
调用IHTMLFormElement::submit()方法实现提交

C#例程:
使用ihtmldocument2的类去控制。

1、添加引用。

在COM中,选择Microsoft.mshtml

2、使用命名空间。

using mshtml;

3、具体代码。

IHTMLDocument2 doc = (IHTMLDocument2)this.webBrowser1.Document.DomDocument;

mshtml.HTMLInputTextElement text1;

text1 = (HTMLInputTextElement)doc.all.item( “username “, 0);
((mshtml.HTMLInputElement)(text1)).value = “warran “;

//这里注意,因为是input输入框,所以要定义HTMLInputTextElement类

text1 = (HTMLInputTextElement)doc.all.item( “password “, 0);
((mshtml.HTMLInputElement)(text1)).value = “123456 “;

mshtml.HTMLFormElement f1 = (mshtml.HTMLFormElement)doc.all.item( “form1 “, 0);
((HTMLFormElement)(f1)).submit();

//因为是form表单,所以要定义HTMLFormElement类

DELPHI 例程

procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
input:OleVariant;
userinputelement,pwdinputelement:ihtmlinputelement;
begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item(‘user'(也就是网页中用户名控件的名字),0) as ihtmlinputelement);
userinputelement.value:=edit1.text;(也就是你要向网页输入的东西)
pwdinputelement:=(doc.all.item(‘password’,0) as ihtmlinputelement);
pwdinputelement.value:=edit2.text;
input:=doc.all.item(‘submit’,0);
input.click;
end;

当提交数据按钮没有NAME属性时,采用如下方法:
procedure TForm1.Button1Click(Sender: TObject);
var
Doc:IHTMLDocument2;
form:ithmlformelement;
userinputelement,pwdinputelement:ihtmlinputelement;

begin
doc:=webbrowser1.document as ihtmldocument2;
userinputelement:=(doc.all.item(‘user'(也就是网页中用户名控件的名字),0) as ihtmlinputelement);
userinputelement.value:=edit1.text;(也就是你要向网页输入的东西)
pwdinputelement:=(doc.all.item(‘password’,0) as ihtmlinputelement);
pwdinputelement:=edit2.text;
form:=(doc.all.item(‘login_form’,0) as ihtmlformelement):
form.submit;
end;

登录”按钮一般都是网页中默认的回车按钮,所以可以用上面代码来代替前面的点击按钮.

【c++】怎样在MFC中调用C#编写的DLL

一、使用 /clr 编译 MFC 可执行文件或规则 DLL
1、打开“项目属性”对话框,方法是右键单击“解决方案资源管理器”中的项目并选择“属性”。
2、展开“配置属性”旁边的节点并选择“常规”。在右侧窗格中的“项目默认值”下,将“公共语言运行库支持”设置为“公共语言运行库支持 (/clr)”。
3、在相同的窗格中,确保将“MFC 的使用”设置为“在共享 DLL 中使用 MFC”。
4、在“配置属性”下,展开“C/C++”旁边的节点并选择“常规”。请确保将“调试信息格式”设置为“程序数据库 /Zi”(而不是“/ZI”)。
5、在“配置属性”下,选择“C/C++”,然后选择“代码生成”。请确保将“运行时库”设置为“多线程调试 DLL (/MDd)”或“多线程 DLL (/MD)”之一。
二、在代码引用需要的dll
#using
#using “DownloaFiles.dll” //换成需要的dll文件
using namespace System;
using namespace CGistarMath;//换成dll中类所使用的namespace
三、在dll函数调用代码前加入#pragma managed
这是manage和unmanage混合编程在MFC下的一种实现方式。

以下是我自己碰到的问题的总结:
当我在声明一个变量的时候,是在.H文件的类里面声明: CGistarMath^ CSPro;
但是编译的时候会出现这个错误:
error C3265: 无法声明托管“CSPro”(在非托管“CMathCPPDlg”中)
不能声明全局或静态变量,也不能声明引用 gc 堆中对象的本机类型成员
因此,我只能讲CGistarMath^ CSPro修改成 CGistarMath^ CSPro = gcnew CGistarMath();并且放入函数的实现当中,才将该问题解决,但是有个缺点就是需要使用到该DLL的函数都要自己生面一个对象,比较麻烦,也容易造成资源浪费。

【C#】 对Excel的操作

这几天为了能在Excel里读写数据,纠结了好几天,不过还是得到了解决:
读取Excel数据:
(1)连接Excel文件。
private static DataSet ds;
private static OleDbDataAdapter adapter;
///

 

///
///

///Excel文件路径 private static void InitExcel(string ExcelPath)
{
try
{
string conn = @”Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” + ExcelPath + “;” + “Extended Properties=Excel 8.0”;
ds = new DataSet();
adapter = new OleDbDataAdapter(“s#lect * from [Sheet1$]”, conn);
adapter.Fill(ds, “tableL”);
}
catch (Exception e)
{
string ss = e.Message;
MessageBox.Show(ss);
}
}
(2)读数据。
public static string ExcelRowData(string ExcelPath, int index_Column)
{
InitExcel(ExcelPath);
System.Data.DataTable table = ds.Tables[0];
DataRow row = table.Rows[0];
string ReturnValue = row[index_Column].ToString();
return ReturnValue;
}
添加数据:
(1)初始化
private static Microsoft.Office.Interop.Excel.Application MyExcel;
private static Workbook wb;
private static Worksheet ws;
public static void InitExcel(string ExcelPath)
{
MyExcel = new Microsoft.Office.Interop.Excel.Application();
object Missing = System.Reflection.Missing.Value;
object No = false;
object Yes = true;
MyExcel.Workbooks.Open(ExcelPath, Yes, No, Missing, Missing, Missing, Yes, Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing);
wb = MyExcel.Workbooks[1];
ws = wb.Worksheets[1];
}
(2)添加列
public static void AddExcelColumn(string SQLName, int index)
{
try
{
ws.Cells[1, index] = SQLName;
}
catch (Exception e)
{
string es = e.Message;
}
}
(3)添加行数据
public static void AddExcelValue(string Value, int index_Column)
{
try
{
ws.Cells[2, index_Column] = Value;
}
catch (Exception e)
{
string es = e.Message;
}
}
(4)退出操作
public static void CloseExcel()
{
wb.Save();
wb.Close(null, null, null);
MyExcel.Workbooks.Close();
MyExcel.Quit();
MyExcel = null;
wb = null;
ws = null;
}
完毕!请大家多给意见。

【C#】 正则表达式

(1)“@”符号
符下两ows表研究室的火热,当晨在“@”虽然并非C#正则表达式的“成员”,但是它经常与C#正则表达式出双入对。“@”表示,跟在它后面的字符串是个“逐字字符串”,不是很好理解,举个例子,以下两个声明是等效的:
string x=”D:\My Huang\My Doc”;
string y = @”D:My HuangMy Doc”;
事实上,如果按如下声明,C#将会报错,因为“”在C#中用于实现转义,如“n”换行:
string x = “D:My HuangMy Doc”;

(2)基本的语法字符。
d 0-9的数字
D d的补集(以所以字符为全集,下同),即所有非数字的字符
w 单词字符,指大小写字母、0-9的数字、下划线
W w的补集
s 空白字符,包括换行符n、回车符r、制表符t、垂直制表符v、换页符f
S s的补集
. 除换行符n外的任意字符
[…] 匹配[]内所列出的所有字符
[^…] 匹配非[]内所列出的字符

下面提供一些简单的示例:

string i = "n";
string m = "3";
Regex r = new Regex(@"D");
//同Regex r = new Regex("\D");
//r.IsMatch(i)结果:true
//r.IsMatch(m)结果:false

string i = "%";
string m = "3";
Regex r = new Regex("[a-z0-9]");
//匹配小写字母或数字字符
//r.IsMatch(i)结果:false
//r.IsMatch(m)结果:true

(3)定位字符

“定位字符”所代表的是一个虚的字符,它代表一个位置,你也可以直观地认为“定位字符”所代表的是某个字符与字符间的那个微小间隙。
^ 表示其后的字符必须位于字符串的开始处
$ 表示其前面的字符必须位于字符串的结束处
b 匹配一个单词的边界
B 匹配一个非单词的边界
另外,还包括:A 前面的字符必须位于字符处的开始处,z 前面的字符必须位于字符串的结束处,Z 前面的字符必须位于字符串的结束处,或者位于换行符前

下面提供一些简单的示例:

string i = "Live for nothing,die for something";
Regex r1 = new Regex("^Live for nothing,die for something$");
//r1.IsMatch(i) true
Regex r2 = new Regex("^Live for nothing,die for some$");
//r2.IsMatch(i) false
Regex r3 = new Regex("^Live for nothing,die for some");
//r3.IsMatch(i) true

string i = @"Live for nothing,
die for something";//多行
Regex r1 = new Regex("^Live for nothing,die for something$");
Console.WriteLine("r1 match count:" + r1.Matches(i).Count);//0
Regex r2 = new Regex("^Live for nothing,die for something$", RegexOptions.Multiline);
Console.WriteLine("r2 match count:" + r2.Matches(i).Count);//0
Regex r3 = new Regex("^Live for nothing,rndie for something$");
Console.WriteLine("r3 match count:" + r3.Matches(i).Count);//1
Regex r4 = new Regex("^Live for nothing,$");
Console.WriteLine("r4 match count:" + r4.Matches(i).Count);//0
Regex r5 = new Regex("^Live for nothing,$", RegexOptions.Multiline);
Console.WriteLine("r5 match count:" + r5.Matches(i).Count);//0
Regex r6 = new Regex("^Live for nothing,rn$");
Console.WriteLine("r6 match count:" + r6.Matches(i).Count);//0
Regex r7 = new Regex("^Live for nothing,rn$", RegexOptions.Multiline);
Console.WriteLine("r7 match count:" + r7.Matches(i).Count);//0
Regex r8 = new Regex("^Live for nothing,r$");
Console.WriteLine("r8 match count:" + r8.Matches(i).Count);//0
Regex r9 = new Regex("^Live for nothing,r$", RegexOptions.Multiline);
Console.WriteLine("r9 match count:" + r9.Matches(i).Count);//1
Regex r10 = new Regex("^die for something$");
Console.WriteLine("r10 match count:" + r10.Matches(i).Count);//0
Regex r11 = new Regex("^die for something$", RegexOptions.Multiline);
Console.WriteLine("r11 match count:" + r11.Matches(i).Count);//1
Regex r12 = new Regex("^");
Console.WriteLine("r12 match count:" + r12.Matches(i).Count);//1
Regex r13 = new Regex("$");
Console.WriteLine("r13 match count:" + r13.Matches(i).Count);//1
Regex r14 = new Regex("^", RegexOptions.Multiline);
Console.WriteLine("r14 match count:" + r14.Matches(i).Count);//2
Regex r15 = new Regex("$", RegexOptions.Multiline);
Console.WriteLine("r15 match count:" + r15.Matches(i).Count);//2
Regex r16 = new Regex("^Live for nothing,r$n^die for something$", RegexOptions.Multiline);
Console.WriteLine("r16 match count:" + r16.Matches(i).Count);//1
//对于一个多行字符串,在设置了Multiline选项之后,^和$将出现多次匹配。

string i = "Live for nothing,die for something";
string m = "Live for nothing,die for some thing";
Regex r1 = new Regex(@"bthingb");
Console.WriteLine("r1 match count:" + r1.Matches(i).Count);//0
Regex r2 = new Regex(@"thingb");
Console.WriteLine("r2 match count:" + r2.Matches(i).Count);//2
Regex r3 = new Regex(@"bthingb");
Console.WriteLine("r3 match count:" + r3.Matches(m).Count);//1
Regex r4 = new Regex(@"bfor somethingb");
Console.WriteLine("r4 match count:" + r4.Matches(i).Count);//1
//b通常用于约束一个完整的单词

(4)重复描述字符
“重复描述字符”是体现C#正则表达式“很好很强大”的地方之一:
{n} 匹配前面的字符n次
{n,} 匹配前面的字符n次或多于n次
{n,m} 匹配前面的字符n到m次
? 匹配前面的字符0或1次
+ 匹配前面的字符1次或多于1次
* 匹配前面的字符0次或式于0次

以下提供一些简单的示例:

string x = "1024";
string y = "+1024";
string z = "1,024";
string a = "1";
string b="-1024";
string c = "10000";
Regex r = new Regex(@"^+?[1-9],?d{3}$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//1
Console.WriteLine("z match count:" + r.Matches(z).Count);//1
Console.WriteLine("a match count:" + r.Matches(a).Count);//0
Console.WriteLine("b match count:" + r.Matches(b).Count);//0
Console.WriteLine("c match count:" + r.Matches(c).Count);//0
//匹配1000到9999的整数。

5)择一匹配
C#正则表达式中的 (|) 符号似乎没有一个专门的称谓,姑且称之为“择一匹配”吧。事实上,像[a-z]也是一种择一匹配,只不过它只能匹配单个字符,而(|)则提供了更大的范围,(ab|xy)表示匹配ab或匹配xy。注意“|”与“()”在此是一个整体。

下面提供一些简单的示例:

string x = "0";
string y = "0.23";
string z = "100";
string a = "100.01";
string b = "9.9";
string c = "99.9";
string d = "99.";
string e = "00.1";
Regex r = new Regex(@"^+?((100(.0+)*)|([1-9]?[0-9])(.d+)*)$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//1
Console.WriteLine("z match count:" + r.Matches(z).Count);//1
Console.WriteLine("a match count:" + r.Matches(a).Count);//0
Console.WriteLine("b match count:" + r.Matches(b).Count);//1
Console.WriteLine("c match count:" + r.Matches(c).Count);//1
Console.WriteLine("d match count:" + r.Matches(d).Count);//0
Console.WriteLine("e match count:" + r.Matches(e).Count);//0
//匹配0到100的数。最外层的括号内包含两部分“(100(.0+)*)”,“([1-9]?[0-9])(.d+)*”,这两部分是“OR”的关系,即正则表达式引擎会先尝试匹配100,如果失败,则尝试匹配后一个表达式(表示[0,100)范围中的数字)。

6)特殊字符的匹配
下面提供一些简单的示例:

string x = "\";
Regex r1 = new Regex("^\\$");
Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1
Regex r2 = new Regex(@"^\$");
Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1
Regex r3 = new Regex("^\$");
Console.WriteLine("r3 match count:" + r3.Matches(x).Count);//0
//匹配“”

string x = """;
Regex r1 = new Regex("^"$");
Console.WriteLine("r1 match count:" + r1.Matches(x).Count);//1
Regex r2 = new Regex(@"^""$");
Console.WriteLine("r2 match count:" + r2.Matches(x).Count);//1
//匹配双引号

(7)组与非捕获组
以下提供一些简单的示例:

string x = "Live for nothing,die for something";
string y = "Live for nothing,die for somebody";
Regex r = new Regex(@"^Live ([a-z]{3}) no([a-z]{5}),die 1 some2$");
Console.WriteLine("x match count:" + r.Matches(x).Count);//1
Console.WriteLine("y match count:" + r.Matches(y).Count);//0
//正则表达式引擎会记忆“()”中匹配到的内容,作为一个“组”,并且可以通过索引的方式进行引用。表达式中的“1”,用于反向引用表达式中出现的第一个组,即粗体标识的第一个括号内容,“2”则依此类推。

string x = "Live for nothing,die for something";
Regex r = new Regex(@"^Live for no([a-z]{5}),die for some1$");
if (r.IsMatch(x))
{
    Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:thing
}
//获取组中的内容。注意,此处是Groups[1],因为Groups[0]是整个匹配的字符串,即整个变量x的内容。

string x = "Live for nothing,die for something";
Regex r = new Regex(@"^Live for no(?<g1>[a-z]{5}),die for some1$");
if (r.IsMatch(x))
{
    Console.WriteLine("group1 value:" + r.Match(x).Groups["g1"].Value);//输出:thing
}
//可根据组名进行索引。使用以下格式为标识一个组的名称(?<groupname>…)。

string x = "Live for nothing nothing";
Regex r = new Regex(@"([a-z]+) 1");
if (r.IsMatch(x))
{
    x = r.Replace(x, "$1");
    Console.WriteLine("var x:" + x);//输出:Live for nothing
}
//删除原字符串中重复出现的“nothing”。在表达式之外,使用“$1”来引用第一个组,下面则是通过组名来引用:
string x = "Live for nothing nothing";
Regex r = new Regex(@"(?<g1>[a-z]+) 1");
if (r.IsMatch(x))
{
    x = r.Replace(x, "${g1}");
    Console.WriteLine("var x:" + x);//输出:Live for nothing
}

string x = "Live for nothing";
Regex r = new Regex(@"^Live for no(?:[a-z]{5})$");
if (r.IsMatch(x))
{
    Console.WriteLine("group1 value:" + r.Match(x).Groups[1].Value);//输出:(空)
}
//在组前加上“?:”表示这是个“非捕获组”,即引擎将不保存该组的内容。

(8)贪婪与非贪婪
正则表达式的引擎是贪婪,只要模式允许,它将匹配尽可能多的字符。通过在“重复描述字符”(*,+)后面添加“?”,可以将匹配模式改成非贪婪。

请看以下示例:

string x = "Live for nothing,die for something";
Regex r1 = new Regex(@".*thing");
if (r1.IsMatch(x))
{
    Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing,die for something
}
Regex r2 = new Regex(@".*?thing");
if (r2.IsMatch(x))
{
    Console.WriteLine("match:" + r2.Match(x).Value);//输出:Live for nothing
}

(9)回溯与非回溯
使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,

请看下面的示例:

string x = "Live for nothing,die for something";
Regex r1 = new Regex(@".*thing,");
if (r1.IsMatch(x))
{
    Console.WriteLine("match:" + r1.Match(x).Value);//输出:Live for nothing,
}
Regex r2 = new Regex(@"(?>.*)thing,");
if (r2.IsMatch(x))//不匹配
{
    Console.WriteLine("match:" + r2.Match(x).Value);
}
//在r1中,“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功。
在r2中,由于强制非回溯,所以整个表达式匹配失败。

(10)正向预搜索、反向预搜索
正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!…)” ,声明本身不作为最终匹配结果的一部分,

请看下面的示例:

string x = "1024 used 2048 free";
Regex r1 = new Regex(@"d{4}(?= used)");
if (r1.Matches(x).Count==1)
{
    Console.WriteLine("r1 match:" + r1.Match(x).Value);//输出:1024
}
Regex r2 = new Regex(@"d{4}(?! used)");
if (r2.Matches(x).Count==1)
{
    Console.WriteLine("r2 match:" + r2.Match(x).Value); //输出:2048
}
//r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。

 

【c#】如何通过socket传输图片

发送端

using Microsoft.Win32;

using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Data.SqlClient;
using System.Configuration;
using System.Net.NetworkInformation;

#endregion

///

/// 应用程序的主入口点。
///

 

public string StrIp = “”;

System.Net.Sockets.Socket sendsocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);

// *********************************************************************************************最小化托盘
this.Hide();
this.ShowInTaskbar = false;
string starupPath = Application.ExecutablePath;
RegistryKey loca = Registry.LocalMachine;
RegistryKey run = loca.CreateSubKey(“SOFTWARE\Microsoft\Windows\CurrentVersion\Run”);
try
{
run.SetValue(“ss”, starupPath);
//MessageBox.Show(“开机自动启动设置成功!!”, “提示”, MessageBoxButtons.OK, MessageBoxIcon.Information)
loca.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), “提示”, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// ****************************************************************************************最小化托盘

//实例化socket
System.Net.IPEndPoint ipendpiont = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(StrIp.Replace(“‘”, “””).Trim()),8080);
try
{
sendsocket.Connect(ipendpiont);
}
catch (Exception se)
{
// MessageBox.Show(“连接错误” + se.Message, “提示信息”, MessageBoxButtons.RetryCancel, MessageBoxIcon.Information);
sendsocket.Close();
return;
}
try
{
//
//建立终结点
System.IO.FileStream fs = new System.IO.FileStream(“d:\新建文件夹\a.jpg”, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Read);
byte[] fssize = new byte[fs.Length];
System.IO.BinaryReader strread = new System.IO.BinaryReader(fs);
strread.Read(fssize, 0, fssize.Length – 1);
sendsocket.Send(fssize);
fs.Close();
sendsocket.Shutdown(System.Net.Sockets.SocketShutdown.Send);
sendsocket.Close();
//
}
catch (Exception ex)
{
string s = ex.ToString();
return;
}
finally
{
//强制关闭发送连接
sendsocket.Close();
}

#region 时钟连接
private void timer1_Tick(object sender, EventArgs e)
{
if (sendsocket.Connected)
{
this.label1.Text = “连接成功”;
}
else
{
return;
}
}
#endregion

接收端

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Drawing;
using System.Text;
using System.Net;
using System.IO;
using System.Net.Sockets;
using System.Drawing.Imaging;
using System.Threading;
using Microsoft.Win32;
using System.Data.SqlClient;

public partial class Admin_FilmPic : System.Web.UI.Page
{
System.Net.Sockets.Socket receivesocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
System.Net.IPEndPoint hostipendpoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 8080);

#region 初始化
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{

}
}
#endregion

#region 监听和连接
//监听和连接
protected void Button2_Click(object sender, EventArgs e)
{

try
{

//设置接收数据缓冲区的大小
byte[] b = new byte[1024 * 4]; //1024* 4
receivesocket.Bind(hostipendpoint);
//监听
receivesocket.Listen(2);
this.Label1.Text = “已经开始监听”;
System.Net.Sockets.Socket hostsocket = receivesocket.Accept();
//如何确定该数组大小
System.IO.MemoryStream fs = new System.IO.MemoryStream();

int got = 0;
int datalength = 0;

while (true)
{
got = hostsocket.Receive(b);
fs.Write(b, 0, got);
if (got > 0)
datalength = datalength + got;
else
break;
}
Bitmap Img = new Bitmap(fs);
Img.Save(Server.MapPath(Request.ApplicationPath) + “\pic\a.jpg”, ImageFormat.Jpeg);
string aa = Server.MapPath(Request.ApplicationPath) + “\pic\a.jpg”;
this.Image1.ImageUrl = aa;
this.Image1.Width = 600;
this.Image1.Height = 400;
//关闭写文件流
fs.Close();
//关闭接收数据的Socket
hostsocket.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
hostsocket.Close();
//关闭发送连接
receivesocket.Close();
// this.Response.Write(““);

}
catch (Exception se)
{
receivesocket.Close();
this.Response.Write(“连接错误” + se.ToString());
return;
}
finally
{
//强制关闭发送连接
receivesocket.Close();
}
}

#endregion
}

【C#】 Winform窗体自动运行隐藏

最近几天都在测试项目距,突然发现winform窗体的隐藏和MFC窗体的隐藏不一样,MFC窗体隐藏只要直接掉类库函数引用就可以了,而winform的却不一样,一开始采用窗体的方法hide,运行时根本就不会隐藏。经过网上查资料:原来可以采用如下方法就可以隐藏.

一:在program.cs文件中:

   注:Client为启动的窗口

       private static ApplicationContext context;
       [STAThread]
       static void Main()
       {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Client Dlg = new Client();
           Dlg.Size = new System.Drawing.Size(0, 0);

           Dlg.Show();
           Dlg.Visible = false;

           context = new ApplicationContext();
           context.ThreadExit += new EventHandler(context_ThreadExit);
           Application.Run(context);  //应用程序运行的主程序是context而窗口就相当于一个“副”程序了。(个人理解)
       }

二:虽然这样设置,还是会出现窗体显示的一瞬间,但是可以采用窗口的模式为:

   FormBorderStyle=None;就可以了。

运行时就会看不到窗体了。