注册 登陆
浏览模式: 标准 | 列表 分类: C#

一些有用的C#正则表达式

"^\d+$" //非负整数(正整数 0) 
"^[0-9]*[1-9][0-9]*$" //正整数 
"^((-\d+)|(0+))$" //非正整数(负整数 0) 
"^-[0-9]*[1-9][0-9]*$" //负整数 
"^-?\d+$" //整数 
"^\d+(\.\d+)?$" //非负浮点数(正浮点数 0) 
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 0) 
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //负浮点数 
"^(-?\d+)(\.\d+)?$" //浮点数 
"^[A-Za-z]+$" //由26个英文字母组成的字符串 
"^[A-Z]+$" //由26个英文字母的大写组成的字符串 
"^[a-z]+$" //由26个英文字母的小写组成的字符串 
"^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 
"^\w+$" //由数字、26个英文字母或者下划线组成的字符串 
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url 
/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 
/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil 
"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 

YYYY-MM-DD基本上把闰年和2月等的情况都考虑进去了 
^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$


  
C#正则表达式 
图片 src[^>]*[^/].(?:jpg|bmp|gif)(?:\"|\') 
中文 ^([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)$ 
网址 "\<a.+?href=['""](?!http\:\/\/)(?!mailto\:)(?>foundAnchor>[^'"">]+?)[^>]*?\>" 

匹配中文字符的正则表达式: [\u4e00-\u9fa5] 

匹配双字节字符(包括汉字在内):[^\x00-\xff] 

匹配空行的正则表达式:\n[\s| ]*\r 

匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 

匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数) 

匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 

匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w./?%&=]*)? 
--------------------------------------------------------------------------- 
以下是例子: 

利用正则表达式限制网页表单里的文本框输入内容: 

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" 

1.用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" 

2.用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 

3.用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 

4.计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 

String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;} 

5.javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下: 

String.prototype.trim function() 

return this.replace(/(^\s*)|(\s*$)/g, ""); 

利用正则表达式分解和转换IP地址: 

6.下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序: 

function IP2V(ip) 

re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式 
if(re.test(ip)) 

return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 

else 

throw new Error("不是一个正确的IP地址!") 

解读 C# 中的正则表达式

  多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。 
  
  此外,regexp类还能够完成一些其他的功能,例如从右至左的结合模式和表达式的编辑等。 
  
  在这篇文章中,我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况,最后,还会介绍一些你可能会用到的常见的表达式。 
  
应该掌握的基础知识

  规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经掌握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。 
  
  如果你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里·弗雷德尔编写的《掌握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。 
  
RegularExpression组合体

  regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如:

csc r:System.Text.RegularExpressions.dll foo.cs

命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。 
  
名字空间简介

  在名字空间中仅仅包含着6个类和一个定义,它们是: 
  
  Capture: 包含一次匹配的结果; 
  CaptureCollection: Capture的序列; 
  Group: 一次组记录的结果,由Capture继承而来; 
  Match: 一次表达式的匹配结果,由Group继承而来; 
  MatchCollection: Match的一个序列; 
  MatchEvaluator: 执行替换操作时使用的代理; 
  Regex: 编译后的表达式的实例。

  Regex类中还包含一些静态的方法:

  Escape: 对字符串中的regex中的转义符进行转义; 
  IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值; 
  Match: 返回Match的实例; 
  Matches: 返回一系列的Match的方法; 
  Replace: 用替换字符串替换匹配的表达式; 
  Split: 返回一系列由表达式决定的字符串; 
  Unescape:不对字符串中的转义字符转义。 
  
简单匹配

  我们首先从使用Regex、Match类的简单表达式开始学习。 
  
Match m = Regex.Match("abracadabra", "(a|b|r)+");
   
我们现在有了一个可以用于测试的Match类的实例,例如:if (m.Success)...
如果想使用匹配的字符串,可以把它转换成一个字符串: 
  
Console.WriteLine("Match="+m.ToString());
   
这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。 
  
字符串的替换

  简单字符串的替换非常直观。例如下面的语句: 
  
string s = Regex.Replace("abracadabra", "abra", "zzzz"); 
   
它返回字符串zzzzcadzzzz,所有匹配的字符串都被替换成了zzzzz。 

  现在我们来看一个比较复杂的字符串替换的例子: 
  
string s = Regex.Replace(" abra ", @"^\s*(.*?)\s*$", "$1");
   
这个语句返回字符串abra,其前导和后缀的空格都去掉了。 
  
  上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中,我们还经常使用字母字符串,在一个字母字符串中,编译程序不把字符“ \” 作为转义字符处理。在使用字符“\”指定转义字符时,@"..."是非常有用的。另外值得一提的是$1在字符串替换方面的使用,它表明替换字符串只能包含被替换的字符串。 
  
匹配引擎的细节

  现在,我们通过一个组结构来理解一个稍微复杂的例子。看下面的例子: 
  
string text = "abracadabra1abracadabra2abracadabra3";
  
    string pat = @"
  
      ( # 第一个组的开始
  
       abra # 匹配字符串abra
  
       ( # 第二个组的开始
  
       cad # 匹配字符串cad
  
       )? # 第二个组结束(可选)
  
      ) # 第一个组结束
  
      + # 匹配一次或多次
  
      ";
  
    //利用x修饰符忽略注释
  
    Regex r = new Regex(pat, "x");
  
    //获得组号码的清单
  
    int[] gnums = r.GetGroupNumbers();
  
    //首次匹配
  
    Match m = r.Match(text);
  
    while (m.Success)
  
     {
  
    //从组1开始
  
     for (int i = 1; i < gnums.Length; i++)
  
      {
  
      Group g = m.Group(gnums[i]);
  
    //获得这次匹配的组
  
      Console.WriteLine("Group"+gnums[i]+"=["+g.ToString()+"]");
  
    //计算这个组的起始位置和长度
  
      CaptureCollection cc = g.Captures;
  
      for (int j = 0; j < cc.Count; j++)
  
       {
  
       Capture c = cc[j];
  
       Console.WriteLine(" Capture" + j + "=["+c.ToString()
  
         + "] Index=" + c.Index + " Length=" + c.Length);
  
       }
  
      }
  
    //下一个匹配
  
     m = m.NextMatch();
  
     }
 
   
 这个例子的输出如下所示:
     
    Group1=[abra]
  
        Capture0=[abracad] Index=0 Length=7
  
        Capture1=[abra] Index=7 Length=4
  
    Group2=[cad]
  
        Capture0=[cad] Index=4 Length=3
  
    Group1=[abra]
  
        Capture0=[abracad] Index=12 Length=7
  
        Capture1=[abra] Index=19 Length=4
  
    Group2=[cad]
  
        Capture0=[cad] Index=16 Length=3
  
    Group1=[abra]
  
        Capture0=[abracad] Index=24 Length=7
  
        Capture1=[abra] Index=31 Length=4
  
    Group2=[cad]
  
        Capture0=[cad] Index=28 Length=3

  我们首先从考查字符串pat开始,pat中包含有表达式。第一个capture是从第一个圆括号开始的,然后表达式将匹配到一个abra。第二个capture组从第二个圆括号开始,但第一个capture组还没有结束,这意味着第一个组匹配的结果是abracad ,而第二个组的匹配结果仅仅是cad。因此如果通过使用?符号而使cad成为一项可选的匹配,匹配的结果就可能是abra或abracad。然后,第一个组就会结束,通过指定+符号要求表达式进行多次匹配。 
  
  现在我们来看看匹配过程中发生的情况。首先,通过调用Regex的constructor方法建立表达式的一个实例,并在其中指定各种选项。在这个例子中,由于在表达式中有注释,因此选用了x选项,另外还使用了一些空格。打开x选项,表达式将会忽略注释和其中没有转义的空格。 
  
  然后,取得表达式中定义的组的编号的清单。你当然可以显性地使用这些编号,在这里使用的是编程的方法。如果使用了命名的组,作为一种建立快速索引的途径这种方法也十分有效。 
  
  接下来是完成第一次匹配。通过一个循环测试当前的匹配是否成功,接下来是从group 1开始重复对组清单执行这一操作。在这个例子中没有使用group 0的原因是group 0是一个完全匹配的字符串,如果要通过收集全部匹配的字符串作为一个单一的字符串,就会用到group 0了。 
  
  我们跟踪每个group中的CaptureCollection。通常情况下每次匹配、每个group中只能有一个capture,但本例中的Group1则有两个capture:Capture0和Capture1。如果你仅需要Group1的ToString,就会只得到abra,当然它也会与abracad匹配。组中ToString的值就是其CaptureCollection中最后一个Capture的值,这正是我们所需要的。如果你希望整个过程在匹配abra后结束,就应该从表达式中删除+符号,让regex引擎知道我们只需要对表达式进行匹配。 
  
基于过程和基于表达式方法的比较

  一般情况下,使用规则表达式的用户可以分为以下二大类:第一类用户尽量不使用规则表达式,而是使用过程来执行一些需要重复的操作;第二类用户则充分利用规则表达式处理引擎的功能和威力,而尽可能少地使用过程。 
  
  对于我们大多数用户而言,最好的方案莫过于二者兼而用之了。我希望这篇文章能够说明.NET语言中regexp类的作用以及它在性能和复杂性之间的优、劣点。 
  
基于过程的模式

  我们在编程中经常需要用到的一个功能是对字符串中的一部分进行匹配或其他一些对字符串处理,下面是一个对字符串中的单词进行匹配的例子:

string text = "the quick red fox jumped over the lazy brown dog.";
  
    System.Console.WriteLine("text=[" + text + "]");
  
    string result = "";
  
    string pattern = @"\w+|\W+";
  
    foreach (Match m in Regex.Matches(text, pattern))
  
     {
  
    // 取得匹配的字符串
  
     string x = m.ToString();
  
    // 如果第一个字符是小写
  
     if (char.IsLower(x[0]))
  
    // 变成大写
  
      x = char.ToUpper(x[0]) + x.Substring(1, x.Length-1);
  
    // 收集所有的字符
  
     result += x;
  
     }
  
    System.Console.WriteLine("result=[" + result + "]");

   
   正象上面的例子所示,我们使用了C#语言中的foreach语句处理每个匹配的字符,并完成相应的处理,在这个例子中,新创建了一个result字符串。这个例子的输出所下所示: 
  
  text=[the quick red fox jumped over the lazy brown dog.] 
  
  result=[The Quick Red Fox Jumped Over The Lazy Brown Dog.] 
  
基于表达式的模式

  完成上例中的功能的另一条途径是通过一个MatchEvaluator,新的代码如下所示: 
  
static string CapText(Match m)
  
      {
  
    //取得匹配的字符串
  
      string x = m.ToString();
  
    // 如果第一个字符是小写
  
      if (char.IsLower(x[0]))
  
    // 转换为大写
  
       return char.ToUpper(x[0]) + x.Substring(1, x.Length-1);
  
      return x;
  
      }
  
      
  
     static void Main()
  
      {
  
      string text = "the quick red fox jumped over the
  
       lazy brown dog.";
  
      System.Console.WriteLine("text=[" + text + "]");
  
      string pattern = @"\w+";
  
      string result = Regex.Replace(text, pattern,
  
     new MatchEvaluator(Test.CapText));
  
      System.Console.WriteLine("result=[" + result + "]");
  
      }
 
   
  同时需要注意的是,由于仅仅需要对单词进行修改而无需对非单词进行修改,这个模式显得非常简单。

常用表达式

  为了能够更好地理解如何在C#环境中使用规则表达式,我写出一些对你来说可能有用的规则表达式,这些表达式在其他的环境中都被使用过,希望能够对你有所帮助。 
  
罗马数字

string p1 = "^m*(d?c{0,3}|c[dm])" + "(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$";
  
    string t1 = "vii";
  
    Match m1 = Regex.Match(t1, p1);
 
   
交换前二个单词

string t2 = "the quick brown fox";
  
    string p2 = @"(\S+)(\s+)(\S+)";
  
    Regex x2 = new Regex(p2);
  
    string r2 = x2.Replace(t2, "$3$2$1", 1);

   
关健字=值

string t3 = "myval = 3";
  
    string p3 = @"(\w+)\s*=\s*(.*)\s*$";
  
    Match m3 = Regex.Match(t3, p3);

   
实现每行80个字符

string t4 = "********************"
  
     + "******************************"
  
     + "******************************";
  
    string p4 = ".{80,}";
  
    Match m4 = Regex.Match(t4, p4);

   
月/日/年 小时:分:秒的时间格式

string t5 = "01/01/01 16:10:01";
  
    string p5 = @"(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)";
  
    Match m5 = Regex.Match(t5, p5);

   
改变目录(仅适用于Windows平台)

string t6 = @"C:\Documents and Settings\user1\Desktop\";
  
  string r6 = Regex.Replace(t6,@"\\user1\\", @"\\user2\\");

   
扩展16位转义符

string t7 = "%41"; // capital A
  
    string p7 = "%([0-9A-Fa-f][0-9A-Fa-f])";
  
    string r7 = Regex.Replace(t7, p7, HexConvert);
 
   
删除C语言中的注释(有待完善)

string t8 = @"
  
    /*
  
     * 传统风格的注释
  
     */
  
    ";
  
    string p8 = @"
  
     /\* # 匹配注释开始的定界符
  
     .*? # 匹配注释
  
     \*/ # 匹配注释结束定界符
  
    ";
  
    string r8 = Regex.Replace(t8, p8, "", "xs");
 
   
删除字符串中开始和结束处的空格

string t9a = " leading";
  
    string p9a = @"^\s+";
  
    string r9a = Regex.Replace(t9a, p9a, "");
  
    string t9b = "trailing ";
  
    string p9b = @"\s+$";
  
    string r9b = Regex.Replace(t9b, p9b, "");
 
   
在字符\后添加字符n,使之成为真正的新行

string t10 = @"\ntest\n";
  
    string r10 = Regex.Replace(t10, @"\\n", "\n");
 
   
转换IP地址

string t11 = "55.54.53.52";
  
    string p11 = "^" +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])\." +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])\." +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])\." +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])" +
  
     "$";
  
    Match m11 = Regex.Match(t11, p11);
 
   
删除文件名包含的路径

string t12 = @"c:\file.txt";
  
    string p12 = @"^.*\\";
  
    string r12 = Regex.Replace(t12, p12, "");
 
   
联接多行字符串中的行

string t13 = @"this is
  
    a split line";
  
    string p13 = @"\s*\r?\n\s*";
  
    string r13 = Regex.Replace(t13, p13, " ");

   
提取字符串中的所有数字

string t14 = @"
  
    test 1
  
    test 2.3
  
    test 47
  
    ";
  
    string p14 = @"(\d+\.?\d*|\.\d+)";
  
    MatchCollection mc14 = Regex.Matches(t14, p14);
 
   
找出所有的大写字母

string t15 = "This IS a Test OF ALL Caps";
  
    string p15 = @"(\b[^\Wa-z0-9_]+\b)";
  
    MatchCollection mc15 = Regex.Matches(t15, p15);
 
   
找出小写的单词

string t16 = "This is A Test of lowercase";
  
    string p16 = @"(\b[^\WA-Z0-9_]+\b)";
  
    MatchCollection mc16 = Regex.Matches(t16, p16);
 
   
找出第一个字母为大写的单词

string t17 = "This is A Test of Initial Caps";
  
    string p17 = @"(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)";
  
    MatchCollection mc17 = Regex.Matches(t17, p17);

   
找出简单的HTML语言中的链接

 

string t18 = @"
  
    <html>
  
    <a href=""first.htm"">first tag text</a>
  
    <a href=""next.htm"">next tag text</a>
  
    </html>
  
    ";
  
    string p18 = @"<A[^>]*?HREF\s*=\s*[""']?" + @"([^'"" >]+?)[ '""]?>";
  
    MatchCollection mc18 = Regex.Matches(t18, p18, "si");

C#实现web信息自动抓取

C#代码
  1. ASP.Net (GetWebcontent.aspx)      
  2.      
  3.      
  4.      
  5. <%@ Page Language="C#" %>      
  6.      
  7. <%@ Import Namespace="System.Net" %>      
  8.      
  9. <%@ Import Namespace="System.Text" %>      
  10.      
  11. <script runat=server>      
  12.      
  13.    //***********************************************************      
  14.      
  15.    //*                    
  16.      
  17.    //*    使用ASP.Net实现网站小偷的程序           
  18.      
  19.    //*       Written by 笑笑 2005-12-11             
  20.      
  21.    //*       网址:http://blog.hnce.net             
  22.      
  23.    //*       Email:hedongyang@gmail.com QQ:5364083          
  24.      
  25.    //*                     
  26.      
  27.    //***********************************************************      
  28.      
  29. void Page_Load(Object sender , EventArgs e)       
  30.      
  31. {      
  32.      
  33.    string strurl="http://blog.hnce.net";    //欲获取的网页地址      
  34.      
  35.          
  36.      
  37.    WebClient myWebClient=new WebClient();    //创建WebClient实例myWebClient      
  38.      
  39.          
  40.      
  41.    //获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。      
  42.      
  43.    myWebClient.Credentials=CredentialCache.DefaultCredentials;      
  44.      
  45.          
  46.      
  47.    //从资源下载数据并返回字节数组。(加@是因为网址中间有"/"符号)      
  48.      
  49.    byte[] pagedata=myWebClient.DownloadData(strurl);      
  50.      
  51.          
  52.      
  53.    //以下两句每次只要使用一条即可,功能是一样是用来转换字符集,根据获取网站页面的字符编码选择      
  54.      
  55.    //string result=Encoding.Default.GetString(pagedata);              
  56.      
  57.    //如果获取网站页面采用的是GB2312,则使用这句      
  58.      
  59.    string result=Encoding.UTF8.GetString(pagedata);       
  60.      
  61.    //如果获取网站页面采用的是UTF-8,则使用这句       
  62.      
  63.    //因为我的博客使用了UTF-8编码,所以在这里我使用这句      
  64.      
  65.    Response.Write(result);   //在WEB页中显示获取的内容      
  66.      
  67. }      
  68.      
  69. </Script>      
  70.      
  71. <html>      
  72.      
  73. <head>      
  74.      
  75. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />      
  76.      
  77. <title>无标题文档</title>      
  78.      
  79. </head>      
  80.      
  81.      
  82.      
  83. <body>      
  84.      
  85. </body>      
  86.      
  87. </html>      
  88.      
  89.      
  90.      
  91. C# (GetWebcontent.cs)      
  92.      
  93.      
  94.      
  95. /*      
  96.      
  97. *********************************************************      
  98.      
  99. *             
  100.      
  101. *  使用C#实现网站小偷的程序         
  102.      
  103. *       Written by 笑笑 2005-12-11         
  104.      
  105. *       网址:http://blog.hnce.net         
  106.      
  107. *       Email:hedongyang@gmail.com QQ:5364083       
  108.      
  109. *             
  110.      
  111. *********************************************************      
  112.      
  113. */      
  114.      
  115. using System;      
  116.      
  117. using System.Net;      
  118.      
  119. using System.Text;      
  120.      
  121.      
  122.      
  123. class GetWebcontent      
  124.      
  125. {      
  126.      
  127.  public static void Main()      
  128.      
  129.  {                 
  130.      
  131.      try     
  132.      
  133.      {      
  134.      
  135.      
  136.      
  137.   WebClient MyWebClient = new WebClient();      
  138.      
  139.      
  140.      
  141.   MyWebClient.Credentials = CredentialCache.DefaultCredentials;      
  142.      
  143.      
  144.      
  145.   Byte[] pageData = MyWebClient.DownloadData("http://blog.hnce.net");      
  146.      
  147.   string pageHtml = Encoding.UTF8.GetString(pageData);      
  148.      
  149.   Console.WriteLine(pageHtml);      
  150.      
  151.      
  152.      
  153.      }       
  154.      
  155.      catch (WebException webEx)      
  156.      
  157.      {      
  158.      
  159.   Console.Write(webEx.ToString());      
  160.      
  161.      }      
  162.      
  163.  }      
  164.      
  165. }    

C# 學習使用ToolTip

VS中,控件默認是不帶提示功能的,但當我們想讓鼠標放在某個控件上時(如下圖),自動提示信息怎麼辦呢?

       

這時我們就可以用ToolTip。這里是用代碼來編碼的。

編寫過程如下:
1、定義一個ToolTip
2、調用ToolTip的SetToolTip方法,設置對需要提示的控件及提示內容即可。

        //1、ToolTip:表示小矩形快顯視窗 (Pop-Up Window),它會在使用者將指標停留在控制項上時,顯示控制項用途的簡短說明。
        ToolTip ttTip = new ToolTip();

 

            //2、定義txtGUID的顯示信息
            ttTip.SetToolTip(txtGUID, "輸入得到GUID數目的整數!");


結果如上圖。

同時我們也可以ToolTip作一些設定。如:

            //ToolTipIcon:取得或設定值,以便定義要顯示在工具提示文字旁的圖示類型。
            ttTip.ToolTipIcon = ToolTipIcon.Info;
            
//ForeColor:取得或設定工具提示的前景色彩。
            ttTip.ForeColor = Color.Blue;
            
//BackColor:取得或設定工具提示的背景色彩。
            ttTip.BackColor = Color.LightGray;
            
//AutoPopDelay:當指標靜止於控制項上時,ToolTip 保持可見的時間 (以毫秒為單位)。預設值為 5000。 
            ttTip.AutoPopDelay=5000;
            
//ToolTipTitle:取得或設定工具提示視窗的標題。
            ttTip.ToolTipTitle = "^ v ^";


這時,提示會變成下圖:
             

  開發人員可以根據實際情況進行設定。

C#播放wma

刚开始玩c# 想在里面加入声音找了一下 实现了

C#代码
  1. using  System.Runtime.InteropServices;   
  2.  
  3. [DllImport("winmm")]   
  4. private static extern long sndPlaySound(string lpszSoundName, long uFlags);    
  5.   
  6.   
  7. sndPlaySound("up.wav", 1);  

C# 消息(Application.DoEvents())

处理当前在消息队列中的所有 Windows 消息。

public static void DoEvents();

 

 

备注

当运行 Windows 窗体时,它将创建新窗体,然后该窗体等待处理事件。该窗体在每次处理事件时,均将处理与该事件关联的所有代码。所有其他事件在队列中等待。在代码处理事件时,应用程序并不响应。例如,当将另一窗口拖到该窗口前面时,该窗口不重新绘制。

如果在代码中调用 DoEvents,则您的应用程序可以处理其他事件。例如,如果您有向 ListBox 添加数据的窗体,并将 DoEvents 添加到代码中,那么当将另一窗口拖到您的窗体上时,该窗体将重新绘制。如果从代码中移除 DoEvents,那么在按钮的单击事件处理程序执行结束以前,您的窗体不会重新绘制。

通常,您在循环中使用该方法来处理消息。

C#代码
  1. private void button1_Click(object sender, System.EventArgs e)   
  2.         {   
  3.             int i=0;   
  4.   
  5.             while(i<10)   
  6.             {   
  7.                 Thread.Sleep(1000);   
  8.                 textBox1.Text += i.ToString() + "\r\n";   
  9.                 Application.DoEvents();   
  10.                 i++;   
  11.             }   
  12.            
  13.