日期判断正则表达式

日期判断正则表达式

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-))$

 

多少年来,许多的编程语言和工具都包含对正则表达式的支持,.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 + "]");

    }

  同时需要注意的是,由于仅仅需要对单词进行修改而无需对非单词进行修改,这个模式显得非常简单。

- 作者: muskteer 2005年07月30日, 星期六 14:32  回复(0) |  引用(0) 加入博采

常用正则表达式集锦

在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:


只能输入数字:“^[0-9]*$”
只能输入n位的数字:“^/d{n}$”
只能输入至少n位数字:“^/d{n,}$”
只能输入m-n位的数字:“^/d{m,n}$”
只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”
只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”
只能输入非零的正整数:“^/+?[1-9][0-9]*$”
只能输入非零的负整数:“^/-[1-9][0-9]*$”
只能输入长度为3的字符:“^.{3}$”
只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”
只能输入由数字、26个英文字母或者下划线组成的字符串:“^/w+$”
验证用户密码:“^[a-zA-Z]/w{5,17}$”正确格式为:以字母开头,长度在6-18之间,

只能包含字符、数字和下划线。
验证是否含有^%&',;=?$/"等字符:“[^%&',;=?$/x22]+”
只能输入汉字:“^[/u4e00-/u9fa5],{0,}$”
验证Email地址:“^/w+[-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*$”
验证InternetURL:“^http://([/w-]+/.)+[/w-]+(/[/w-./?%&=]*)?$”
验证电话号码:“^(/(/d{3,4}/)|/d{3,4}-)?/d{7,8}$”

正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,

“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
验证身份证号(15位或18位数字):“^/d{15}|/d{}18$”
验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”

正确格式为:“01”“09”和“1”“31”。

 

- 作者: muskteer 2005年06月20日, 星期一 19:25  回复(0) |  引用(0) 加入博采

安装vs.net与调试asp.net时遇到的常见问题
安装vs.net与调试asp.net时遇到的常见问题

特搜集了安装vs.net与调试asp.net时遇到的常见问题,希望能给刚接触.net的朋友再遇到此类问题时得已轻松的解决,如果您也遇到此类问题并已经解决而我这里又没帖出来的朋友希望您能将您的问题与解决方法一同帖出来,使此帖成为.Net 下安装、调试的常见问题与错误的一个很好的解决方案,在此谢谢大家的支持!!!


Q:新建项目时出错:Visual Studio .NET 已检测到指定Web服务器运行的不是ASP.NET 1.1版。您将无法运行ASP.NET Web应用程序或服务。
A:http://support.microsoft.com/default.aspx?scid=kb;en-us;817267
---------------------------------------------------------------------------------------------------------------------------------
Q:  关于无法创建aps.web项目的解决办法
A:http://www.csdn.net/develop/Read_Article.asp?Id=19725
---------------------------------------------------------------------------------------------------------------------------------
Q: aspx项目不能调试
A:1、已经启动了一个调试进程(同时打开了两个项目,且有一个已经在调试):同时只能启动一个;
  2、配置文件中debug="false":改成true;
  3、虚拟目录没有建立应用程序(或者名称为空):在虚拟目录属性中“应用程序”点击创建
  4、项目配置为Release:点菜单“生成”-配置,选择“debug”
  5、“你没有调试服务器权限”:修改IE的安全设置,“自动使用当前用户名和密码登录”

如果还不行,参考MS的解决方法:

对照你的错误信息,应该在这个文档中能找到解决办法
http://www.gotdotnet.com/team/csharp/learn/whitepapers/howtosolvedebuggerproblems.doc
---------------------------------------------------------------------------------------------------------------------------------

Q:把.NET程序部署到没有安装.NET Framwork的机器上
A:http://www.microsoft.com/China/Community/program/originalarticles/TechDoc/deployNETApp.mspx
---------------------------------------------------------------------------------------------------------------------------------


Q:安装VS.NET 2003的时候,遇到 "无法访问windows 安装程序组件"的错误
A:根据提示,应该windows installer出了问题。
  需要重新安装windows installer。
  执行如下操作:
  一、先用msiexec /unregserver 停掉windows installer服务。
  二、下载InstMsiW.exe,用winrar解压开。进入目录。
  三、右击msi.inf ,点击安装。
  四、安装vs.net 2003
---------------------------------------------------------------------------------------------------------------------------------

Q:vc软件包不可用或未注册
A:
症状:
当建立一个WinForms应用程序时,收到下述错误信息:"VC软件包不可用或未注册".这个错误甚至会在看上去一个成功的安装之后出现.

起因:
如果Visual Studio.NET安装程序发现一些TLB文件和DLL文件已经存在的话,就不会再次在计算机中注册这些文件,因此
就有可能发生"VC软件包不可用或未注册"的提示.
在多数情况下,旧版本的的Visual Studio .NET容易引起这个错误,尤其是旧版本安装在另一个操作系统下.


解决方案:
要解决这个问题,需要运行Visual Studio .NET修复程序.由于修复程序会强制注册一些安装程序中没有被注册的项目,因此能更有效地解决这个问题.

按照下列步骤运行修复程序:
在开始中,指向"设置",点击控制面板,然后点击"添加/删除程序";
在列出的已安装程序列表中,点击Visual Studio .NET,然后点击"更改/删除";
点击Visual Studio .NET安装对话框1 2 3项目中的第二项;
点击"修复/重装",然后按照屏幕提示操作.

更多相关信息:
重现这个问题的做法
要重现这个问题,最好有装在独立分区上的两个操作系统.两个Windows XP Professional会达到这个目的.
在一个操作系统下安装Visual Studio .NET;
在另一个操作系统下Visual Studio .NET,安装过程中改变安装的缺省路径,以匹配第一次安装的路径.
两次安装结果都会宣告成功.
然后启动第二次安装的Visual Studio .NET(你就会发现这个问题的重现).

这种安装形式是永远不推荐的,即使两次安装选项完全相同,而且你也会以此节省磁盘空间,但这种方法出现潜在问题的机会是很大的.如果一个Visual Studio .NET改变了文件和注册选项,这些改变不会记录到另一个Visual Studio .NET中,以致造成出现不可预料结果的潜在危险.

引自: http://zhuonline.51.net/blogs/archives/000045.html
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q320/4/27.asp&NoWebContent=1
---------------------------------------------------------------------------------------------------------------------------------

Q:不能启动调试,灾难性错误(在 Visual Studio .NET 中调试 ASP.NET 应用程序时出现的常见错误)
A:http://support.microsoft.com/?id=306172
---------------------------------------------------------------------------------------------------------------------------------

Q:在生成安装和部署项目时收到“Unrecoverable Build Error”(不可恢复的生成错误)错误信息
A:http://support.microsoft.com/?id=329214

Automation服务器不能创建对象:
javanow(原作)
  一直用得好好的vs.net编辑器,突然有一天在我新建一个工程时,进行到一半时,弹出"Automation 服务器不能创建对象",然后就停住了。
 
  我到csdn上以"Automation"关键字查阅了C#版的问题,发现有很多朋友都遇上过,而回答的朋友大部分以为提问者问的是IE解析xml文件时的那个错误 (见
http://www.csdn.net/expert/topic/757/757297.xml )
  看到几个回答此类问题的,都是遇到过这个问题的朋友,他们的答案是:重装vs.net都没有作用,最后重新装操作系统才将这个问题解决。
要我装操作系统真是要我的命,所以我一直用 Copy & Paste 工程文件来达到新建工程的目的。

  直到有一天,我无意中点了 vs_setup.msi 来添加 vs.net 的帮助文档(后来才知道应该点setup.exe来添加的)。vs_setup.msi进行到一半,也是出错了,一看调试结果,是FileSystemObject创建失败(感谢上帝,这里的错误信息终于是友好些了)。
vs.net的错误 "Automation 服务器不能创建对象" 是不是也是这个导致的呢?

  我突然想起,前几个月在网上听说可以禁止使用FileSystemObject对象,我当时都忘了怎么操作的了,反正当时一摆弄,具体怎么操作的我也忘了,从那起我也从来没有在我的程序里用过FileSystemObject了。到google上搜索,发现禁止FileSystemObject有3种方法(http://www.sometips.com/faqs/315.htm),第一种方法:修改注册表([HKEY_LOCAL_MACHINE/SOFTWARE/Classes/CLSID/{0D43FE01-F093-11CF-8940-00A0C9054228}/ProgID]
@="Scripting.FileSystemObject"),将FileSystemObject改成一个任意的名字,只有知道该名字的用户才可以创建该对象。我查看注册表,该处的名字还是 Scripting.FileSystemObject.

  那么我的FSO为何不能用呢?我突然想起原来当时我用的是第二种方法,"运行Regsvr32 scrrun.dll /u,所有用户无法创建FileSystemObject"。 当时真是太狠了些。赶快运行 Regsvr32 scrrun.dll。我试着用vs.net 创建一个工程,一阵进度提示,再也没有那个该死的 "Automation 服务器不能创建对象"


其它解决方法相关帖子:
http://yj.sxedu.com.cn/bk/downloadsoft.asp?mclass=14&sclass=29&id=125&keyword=
http://www.csdn.net/develop/article/14/14928.shtm
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q323885


:Unable to start debugging on the web server
A:如果遇到这些错误,则需要考虑以下几个问题:

要检查的内容
远程服务器上的 Web 应用程序
存储在 Visual SourceSafe 中并使用 FrontPage 服务器扩展的 Web 应用程序
手动附加
要检查的内容
如果得到“无法在 Web 服务器上启动调试”错误,请尝试检查下列内容:

您是否正在运行一个允许 Visual Studio 调试器自动附加到 Web 应用程序的 Windows 版本?如果不是,则需要启动应用程序而不调试,然后手动附加到它。(有关更多信息,请参阅手动附加和 ASP.NET 调试:系统要求。)
您的 Web 应用程序是否具有 Web.config 文件?
Web.config 文件是否通过将 debug 属性设置为 true 而启用了调试模式?有关更多信息,请参阅
ASP.NET 应用程序中的调试模式。
Web.config 是否包含任何语法错误?您可以通过运行 Web 应用程序而不调试来检查是否存在语法错误。(从“调试”菜单中,选择“开始执行(不调试)”。)如果在 Web.config 中存在语法错误,则会显示详细信息。
您是否是“调试器用户”(Debugger Users) 组的成员?如果您作为管理员登录,则管理员是否在该组中?
您是否是通过指定特定的 IP 地址(如 100.20.300.400)而创建了项目?调试 Web 服务器要求 NTLM 身份验证。默认情况下,IP 地址被假定为 Internet 的一部分,而在 Internet 上不进行 NTLM 身份验证。若要更正这一问题:
创建项目时,指定 Intranet 上计算机的名称。
-或-

将 IP 地址 (http://100.20.300.400) 添加到您的计算机上的受信任站点列表中。(从 Internet Explorer 的“工具”菜单中,选择“Internet 选项”,然后选择“安全”选项卡)。
运行 IIS 服务器的计算机是否已安装了 Visual Studio .NET 远程组件?
IIS 是否是在安装了 Visual Studio .NET 之后才被安装在本地计算机(即运行 Visual Studio .NET 的计算机)上的?IIS 应在安装 Visual Studio .NET 之前安装。如果它是后来安装的,则可能需要修复 .NET 框架。
修复 .NET 框架

插入 Visual Studio .NET 光盘并运行
<DVD Drive>:/wcu/dotNetFramework/dotnetfx.exe /t:c:/temp /c:"msiexec.exe /fvecms c:/temp/netfx.msi"
-或-

插入 Visual Studio .NET Windows 组件更新光盘并运行

<CD Drive>:/dotNetFramework/ dotnetfx.exe /t:c:/temp /c:"msiexec.exe /fvecms c:/temp/netfx.msi"
是否正确地指定了项目起始页的 URL?扩展名和项目目录是否正确?
是否正确地设置了 IIS 安全设置?若要验证这一点,请检查“默认 Web 站点”设置。
检查“默认 Web 站点”的 IIS 安全设置

从“开始”菜单中,依次选择“程序”和“管理工具”,然后单击“Internet 服务管理器”(Windows 2000) 或“Internet 信息服务”(Windows XP)。
在“Internet 服务管理器”或“Internet 信息服务”对话框中,单击您的计算机的树控件 (Tree Control)。在“Web 站点”文件夹中,找到“默认 Web 站点”。
右击“默认 Web 站点”并选择“属性”。
在“默认 Web 站点属性”窗口中,选择“目录安全性”选项卡并单击“编辑”。
在“身份验证方法”对话框中,选择“匿名访问”和“集成的 Windows 身份验证”(如果尚未选择的话)。
单击“确定”以关闭“Internet 服务管理器”或“Internet 信息服务”对话框。
单击“确定”。
对于 ATL Server 应用程序,请验证 DEBUG 谓词是否与您的 ISAPI 扩展相关联。
对于
ASP.NET 应用程序,请确保应用程序的虚拟文件夹具有在“Internet 服务管理器”或“Internet 信息服务”中设置的“应用程序名称”。
为 Web 应用程序指定虚拟文件夹

从“开始”菜单中,依次选择“程序”和“管理工具”,然后单击“Internet 服务管理器”(Windows 2000) 或“Internet 信息服务”(Windows XP)。
在“Internet 服务管理器”或“Internet 信息服务”对话框中,单击您的计算机的树控件 (Tree Control)。在“Web 站点”文件夹中,找到此 Web 应用程序。
右击“默认 Web 站点”并选择“属性”。
在“默认 Web 站点属性”窗口中,选择“目录”选项卡。
在“应用程序设置”下,单击“创建”。
应用程序名称即出现在此框中。

单击“确定”关闭“属性”对话框。
单击“确定”以关闭“Internet 服务管理器”或“Internet 信息服务”对话框。
远程服务器上的 Web 应用程序
如果 Web 应用程序位于远程服务器上,请检查以下问题:

是否运行了正确的安装程序以便在服务器上安装 ASP.NET/ATL Server 和远程调试器组件?
您是否是服务器上的“调试器用户”(Debugger Users) 组的成员?您是否具有调试在系统帐户下运行的进程所必需的访问特权?
根据安全设置的不同,ASP.NET 应用程序可能在 inetinfo.exe(IIS 进程)下运行,也可能在 ASP 辅助进程 aspnet_wp.exe 下运行。默认情况下,aspnet_wp.exe 进程作为 SYSTEM 运行。若要调试在 aspnet_wp.exe 下运行的应用程序,您需要具有管理员特权或为 aspnet_wp.exe 编辑 machine.config 文件,以便 aspnet_wp.exe 在用户帐户下运行。若要调试在 inetinfo.exe 下运行的应用程序,您必须是运行 inetinfo.exe 的计算机上的管理员。

根据安全设置的不同,ATL Server 应用程序可能在 inetinfo.exe 下运行,也可能在 ATL 辅助进程 dllhost.exe 下运行。若要调试在 inetinfo.exe 下运行的应用程序,您必须是运行 inetinfo.exe 的计算机上的管理员,或者使用公共语言运行库应用程序设置将 dllhost 配置为作为特定用户运行。
您是否正在使用“终端服务器”尝试调试远程计算机上的 Web 应用程序?在 Windows XP 下,支持使用“终端服务器”对本机 Web 应用程序进行远程调试。而在 Windows 2000 或 Windows NT 下则不支持。
存储在 Visual SourceSafe 中并使用 FrontPage 服务器扩展的 Web 应用程序
如果 Web 应用程序存储在 Visual SourceSafe 中并且使用 FrontPage 服务器扩展作为它的 Web 访问模式,请检查以下问题:

Visual SourceSafe 是否与 FrontPage 服务器/Web 服务器位于同一台计算机上?如果是,则可以使用“集成身份验证”进行调试。(若要检查“集成身份验证”设置,请参阅此过程以检查前面的“默认 Web 站点”的 IIS 安全设置。)
解决这一问题的另一种方法是将 Web 访问模式从 FrontPage 更改为文件共享 (File Share)。
将 Web 访问模式更改为文件共享 (File Share)

在解决方案资源管理器中,右击项目名称,然后从快捷菜单中选择“属性”。
在“<Project> 属性页”对话框中,打开“通用属性”文件夹,然后选择“Web 设置”。
在“Web 服务器连接”下,单击“Web 访问模式”,然后从列表框中选择“文件共享”。
单击“确定”以关闭“<Project> 属性页”对话框。
手动附加
如果按照这些疑难解答步骤执行了相应操作,而在开始调试时仍然收到错误信息,则可能需要尝试通过手动附加来调试应用程序。

手动附加

启动应用程序而不调试。(从“调试”菜单中,选择“开始执行(不调试)”。)
附加到适当的 IIS 进程或辅助进程。默认情况下,对于 ATL Server 应用程序为 inetinfo.exe;对于
ASP.NET 应用程序为 aspnet_wp.exe。使用下面的过程来确定 ASP.NET 或 ATL Server 应用程序在哪个进程下运行。
检查
ASP.NET 应用程序在哪个进程下运行

使用 Visual Studio .NET 或其他文本编辑器打开应用程序的 machine.config 文件。
找到下面的进程模型属性:
enable
如果 enable 设置为 TRUE,则应用程序在 aspnet_wp.exe 下运行(这也是默认设置。)

如果 enable 设置为 FALSE,则应用程序在 inetinfo.exe 下运行。

检查 ATL Server 应用程序在哪个进程下运行

在解决方案资源管理器中,右击项目名称,然后从快捷菜单中选择“属性”。
在“<Project> 属性页”对话框中,打开“Web 部署”文件夹,然后选择“常规”。
查看“应用程序保护”设置。
如果此设置为“低(IIS 进程)”,则应用程序在 inetinfo.exe 下运行。

如果此设置为“中等(池)”,则应用程序在 dllhost.exe 进程下运行(与其他放入池中的 ATL Server 应用程序相同)。

如果此设置为“高(独立)”,则应用程序在 dllhost.exe 进程下运行(与其他 ATL Server 应用程序不同)。

单击“确定”以关闭“<Project> 属性页”对话框。
请参见
调试脚本和 Web:错误和疑难解答
Q:web访问失败
此项目的默认web访问模式设置为文件共享,但无法从路径“D:/inetpub/bweb”打开“http://localhost/bweb”处的

项目文件夹,返回的错误是:
    无法打开Web项目“bweb”。文件路径“D:/inetpub/bweb”与URL“http://localhost/bweb”不符。这两者需要映

射到不同的服务器位置。HTTP错误404:Not Found

A:1。打开IIS管理器。

2。右键点击"Default Web Site"并选择Properties.

3。 点击"Http Header".

4。 点击"MIME Types".

5。 点击“New”。

6。 在Extension中,输入".tmp". (不需要引号)

7。 在MIME Type中,输入 "Temp". (不需要引号)
Q:VS.NET调试问题
A:关于VisualStudio.NET里调试出现的一系列问题,例如没有权限调试Web服务器,不属于Debugger Users组、无法调试等情况,都可以在The VS7 Debugger doesn’t work. What can I do(
http://blogs.msdn.com/mkpark/articles/86872.aspx)该文上找到答案。 我就碰到过没有权限在Web服务器上调试的情况,后来选中了IE的Internet选项->安全->Intranet->自定义级别->用户验证的“自动使用当前用户和密码登录”才解决无法调试的问题。怎么会想到VS.NET无法调试还要修改IE选项

- 作者: muskteer 2005年06月13日, 星期一 14:47  回复(0) |  引用(0) 加入博采

asp.net常用函数

- 作者: muskteer 2005年06月13日, 星期一 14:28  回复(0) |  引用(0) 加入博采

C#编码标准--编码习惯
1. 避免将多个类放在一个文件里面。
  2. 一个文件应该只有一个命名空间,避免将多个命名空间放在同一个文件里面。
  3. 一个文件最好不要超过500行的代码(不包括机器产生的代码)。
  4. 一个方法的代码长度最好不要超过25行。
  5. 避免方法中有超过5个参数的情况。使用结构来传递多个参数。
  6. 每行代码不要超过80个字符。
  7. 不要手工的修改机器产生的代码。
  a) 如果需要编辑机器产生的代码,编辑格式和风格要符合该编码标准。
  b) Use partial classes whenever possible to factor out the maintained portions.
  8. 避免利用注释解释显而易见的代码。
   a) 代码应该可以自解释。好的代码由可读的变量和方法命名因此不需要注释。
  b). Document only operational assumptions, algorithm insights and so on.
  10. 避免使用方法级的文档。
  a) 使用扩展的API文档说明之。
  b) 只有在该方法需要被其他的开发者使用的时候才使用方法级的注释。(在C#中就是///)
  11. 不要硬编码数字的值,总是使用构造函数设定其值。
  12. 只有是自然结构才能直接使用const,比如一个星期的天数。
  13. 避免在只读的变量上使用const。如果想实现只读,可以直接使用readonly。
  public class MyClass
  {
   public readonly int Number;
   public MyClass(int someValue)
   {
   Number = someValue;
   }
   public const int DaysInWeek = 7;
  }
  14. 每个假设必须使用Assert检查
  a) 平均每15行要有一次检查(Assert)
  using System.Diagnostics;
  
  object GetObject()
  {…}
  
  object obj = GetObject();
  Debug.Assert(obj != null);
  15. 代码的每一行都应该通过白盒方式的测试。
  16. 只抛出已经显示处理的异常。
  17. 在捕获(catch)语句的抛出异常子句中(throw),总是抛出原始异常维护原始错误的堆栈分配。
  catch(Exception exception)
  {
   MessageBox.Show(exception.Message);
   throw ; //和throw exception一样。
  }
  18. 避免方法的返回值是错误代码。
  19. 尽量避免定义自定义异常类。
  20. 当需要定义自定义的异常时:
  a) 自定义异常要继承于ApplicationException。
  b) 提供自定义的序列化功能。
  21. 避免在单个程序集里使用多个Main方法。
  22. 只对外公布必要的操作,其他的则为internal。
  23. Avoid friend assemblies, as it increases inter-assembly coupling.
  24. Avoid code that relies on an assembly running from a particular location.
  25. 使应用程序集尽量为最小化代码(EXE客户程序)。使用类库来替换包含的商务逻辑。
  26. 避免给枚举变量提供显式的值。
  //正确方法
  public enum Color
  {
   Red,Green,Blue
  }
  //避免
  public enum Color
  {
   Red = 1,Green = 2,Blue = 3
  }
  27. 避免指定特殊类型的枚举变量。
  //避免
  public enum Color : long
  {
   Red,Green,Blue
  }
  28. 即使if语句只有一句,也要将if语句的内容用大括号扩起来。
  29. 避免使用trinary条件操作符。
  30. 避免在条件语句中调用返回bool值的函数。可以使用局部变量并检查这些局部变量。
  bool IsEverythingOK()
  {…}
  //避免
  if (IsEverythingOK ())
  {…}
  //替换方案
  bool ok = IsEverythingOK();
  if (ok)
  {…}
  31. 总是使用基于0开始的数组。
  32. 在循环中总是显式的初始化引用类型的数组。
  public class MyClass
  {}
  MyClass[] array = new MyClass[100];
  for(int index = 0; index < array.Length; index++)
  {
   array[index] = new MyClass();
  }
  33. 不要提供public 和 protected的成员变量,使用属性代替他们。
  34. 避免在继承中使用new而使用override替换。
  35. 在不是sealed的类中总是将public 和 protected的方法标记成virtual的。
  36. 除非使用interop(COM+ 或其他的dll)代码否则不要使用不安全的代码(unsafe code)。
  37. 避免显示的转换,使用as操作符进行兼容类型的转换。
  Dog dog = new GermanShepherd();
  GermanShepherd shepherd = dog as GermanShepherd;
  if (shepherd != null )
  {…}
  38. 当类成员包括委托的时候
  a) Copy a delegate to a local variable before publishing to avoid concurrency race
  condition.
  b) 在调用委托之前一定要检查它是否为null
  public class MySource
  {
   public event EventHandler MyEvent;
   public void FireEvent()
   {
   EventHandler temp = MyEvent;
   if(temp != null )
   {
   temp(this,EventArgs.Empty);
   }
   }
  }
  39. 不要提供公共的事件成员变量,使用事件访问器替换这些变量。
  public class MySource
  {
   MyDelegate m_SomeEvent ;
   public event MyDelegate SomeEvent
   {
   add
   {
   m_SomeEvent += value;
   }
   remove
   {
   m_SomeEvent -= value;
   }
   }
  }
  40. 使用一个事件帮助类来公布事件的定义。
  41. 总是使用接口。
  42. 类和接口中的方法和属性至少为2:1的比例。
  43. 避免一个接口中只有一个成员。
  44. 尽量使每个接口中包含3-5个成员。
  45. 接口中的成员不应该超过20个。
  a) 实际情况可能限制为12个
  46. 避免接口成员中包含事件。
  47. 避免使用抽象方法而使用接口替换。
  48. 在类层次中显示接口。
  49. 推荐使用显式的接口实现。
  50. 从不假设一个类型兼容一个接口。Defensively query for that interface.
  SomeType obj1;
  IMyInterface obj2;
  /* 假设已有代码初始化过obj1,接下来 */
  obj2 = obj1 as IMyInterface;
  if (obj2 != null)
  {
   obj2.Method1();
  }
  else
  {
   //处理错误
  }
  51. 表现给最终用户的字符串不要使用硬编码而要使用资源文件替换之。
  52. 不要硬编码可能更改的基于配置的字符串,比如连接字符串。
  53. 当需要构建长的字符串的时候,使用StringBuilder不要使用string
  54. 避免在结构里面提供方法。
  a) 建议使用参数化构造函数
  b) 可以重裁操作符
  55. 总是要给静态变量提供静态构造函数。
  56. 能使用早期绑定就不要使用后期绑定。
  57. 使用应用程序的日志和跟踪。
  58. 除非在不完全的switch语句中否则不要使用goto语句。
  59. 在switch语句中总是要有default子句来显示信息(Assert)。
  int number = SomeMethod();
  switch(number)
  {
   case 1:
   Trace.WriteLine("Case 1:");
   break;
   case 2:
   Trace.WriteLine("Case 2:");
   break;
   default :
   Debug.Assert(false);
   break;
  }
  60. 除非在构造函数中调用其他构造函数否则不要使用this指针。
  // 正确使用this的例子
  public class MyClass
  {
   public MyClass(string message )
   {}
   public MyClass() : this("hello")
   {}
  }
  61. 除非你想重写子类中存在名称冲突的成员或者调用基类的构造函数否则不要使用base来访问基类的成员。
  // 正确使用base的例子
  public class Dog
  {
   public Dog(string name)
   {}
   virtual public void Bark( int howLong)
   {}
  }
  public class GermanShepherd : Dog
  {
   public GermanShe pherd(string name): base (name)
   {}
   override public void Bark(int howLong)
   {
   base .Bark(howLong);
   }
  }
  62. 基于模板的时候要实现Dispose()和Finalize()两个方法。
  63. 通常情况下避免有从System.Object转换来和由System.Object转换去的代码,而使用强制转换或者as操作符替换。
  class SomeClass
  {}
  //避免:
  class MyClass
  {
   void SomeMethod(T t)
   {
   object temp = t;
   SomeClass obj = (SomeClass)temp;
   }
  }
  // 正确:
  class MyClass where T : SomeClass
  {
   void SomeMethod(T t)
   {
   SomeClass obj = t;
   }
  }
  64. 在一般情况下不要定影有限制符的接口。接口的限制级别通常可以用强类型来替换之。
  public class Customer
  {…}
  //避免:
  public interface IList where T : Customer
  {…}
  //正确:
  public interface ICustomerList : IList
  {…}
  65. 不确定在接口内的具体方法的限制条件。
  66. 总是选择使用C#内置(一般的generics)的数据结构

- 作者: muskteer 2005年06月10日, 星期五 12:32  回复(0) |  引用(0) 加入博采

用DataReader还是DataSet? (转载)
我经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优点和不足,你可以根据应用环境来选择用哪一个。
  
  本文就两者的选择问题做了很清楚的讲述,可以让你在运用ASP.NET时,在选择DataReader类或DataSet类的方面得到一些指南。在基于客户端的Windows Form应用程序环境下,这些规则可能会改变。我在做这些讲述时,假设你已经用过DataReader和DataSet类了,并对它们很熟悉。
  
  运用DataReader类
  下面就是运用DataReader类的理想条件: 你读取的数据必须是新的,所以在每次需要数据的时候,你都必须从数据库读取。创建一个DataReader类不会消耗很多内存,不过随着负荷的增加,DataSet上的性能也会很快地提高(参考资源中Visual Studio Magazine中的文章)。
  
   你对每行数据的需求很简单。该情况的最好的例子就是简单地将DataReader绑定到一个Web控件,如DataGrid或DropDownList。
  
   你只需要从数据库中以只向前的(forward-only) 、只读的形式来存取XML数据。在这种情况下,你可以用SQLCommand对象的ExcecuteXmlReader()方法来得到一个XmlReader类(相当于XML版的DataReader)。这就需要一个运用FOR XML子句的SQL Server查询,或者一个包含有效XML的ntext字段。
   你计划对数据库进行几个重复的调用,来读取一小块信息。在这种情况下,我们前面提到过的性能数据会有更大的提高。
  
   的确,使DataSet类更强大的许多功能只适用于基于客户端的Windows Form应用程序,比如在多个表之间建立关系的功能。在很多情况下,DataSet类都比DataReader类更有优势,而且在有些情况下,你根本就不能用DataReader类。
  
  运用DataSet类
  在下面的情况,你应该考虑运用DataSet类: 你构建了一个Web service,它运用的数据是你作为返回值读取的数据。因为DataReader类必须保持到数据库的连接,所以它们不能被序列化到XML中,也不能被发送给一个Web service的调用者。
  
   你需要排序或筛选数据。在运用一个DataView对象(呈现为DataTable类的DefaultView属性,它包含一个DataSet类)来排序或筛选数据前,我们先试着用SQL查询(如WHERE和ORDER BY语句)来实现这些功能,并运用更轻量级、更快的DataReader类。然而,有时侯用这种方法是不行的,或者当你需要多次地对数据进行排序或筛选时就不能用DataReader。
  
   针对同一请求,你需要多次遍历数据。你只能在DataReader中循环一次。如果你想将多个ServerControl类绑定到同一个数据集,那么选择DataSet就更好。DataReader类不能被绑定到多个ServerControl类,因为它是只向前读取的。在这种情况下,如果要使用DataReader,必须从数据库读取两次数据。
  
   你需要存储数据,而后续的页面请求可能会用到的这些数据。如果数据只被请求它的专门的人使用,你可以将DataSet类保存在一个Session变量中。如果数据可以被任何人访问,那么你可以将它保存在一个Application变量中,或保存在Cache中(我建议使用后一种方法,因为它支持时间期限和回调(callback))。因为DataReader类必须一直打开对数据库的连接,而且它一次只能保存一行数据,所以它们不能在跨页面请求中被保存。
  
   你需要对一个结果集的每个元素实现特殊的、耗时的功能。例如,如果你从一个数据库读取一列邮政编码,并想通过调用一个Web service来得到每个地区的详细的天气状况信息,那么选择DataSet就会更好。这是因为,当你在用DataReader类时,在关闭DataReader类前,与数据库的连接不会被释放回连接池。在数千页面请求之间潜在的一个很小的延时都会造成Web应用程序的很高的访问量,从而就会消耗完可用的连接。相反,DataSet可以在前端读取所有的数据,并可以马上关闭与数据库的连接,将它返回到连接池,因此其它的页面请求就可以用这个连接了。
  
   你需要在一个两维范例中加载并处理XML数据。DataSet类对于XML很有用,因为你可以将DataView用于XML,对根本的数据进行排序和筛选,就同处理一个数据库结果集一样。然而,需要注意的是在System.Xml名字空间中有很多类,你可以将它们用于更复杂的XML操作。
  
   你的数据源不是一个数据库。虽然OleDbDataReader可以用于任何OLEDB数据提供者(可能指向一个数据库,也可能不指向一个数据库),但DataSet对象可以从一个XML文件直接加载数据,并动态地解释它的schema。DataSet类也可以将XML数据写回一个数据流或一个文件。
  
  从上面的讲述我们就可以看到,DataSet类比DataReader类有更多的功能,这就可以让你在更多的情况下运用它们。但这并不意味着你总是在用DataSet类。你需要在ASP.NET中完成的相当大一部分的任务都属于DataReader的范畴。
  
  尽管如此,毫无疑问,从重要程度或复杂程度的角度来说,DataSet类在很多ASP.NET Web应用程序中都起着很重要的作用。你可以通过明智的缓存来最小化数据库往返,从而降低DataSet类的“性能损害”。DataReader和DataSet都是一个成功的ASP.NET Web应用程序的重要的部件。重要的是,我们需要了解何时、在哪里可以最好的使用它们。

- 作者: muskteer 2005年06月10日, 星期五 12:31  回复(0) |  引用(0) 加入博采

C#中一些字符串操作的常用用法
//获得汉字的区位码
  byte[] array = new byte[2];
  array = System.Text.Encoding.Default.GetBytes("啊");
  
  int i1 = (short)(array[0] - '/0');
  int i2 = (short)(array[1] - '/0');
  
  //unicode解码方式下的汉字码
  array = System.Text.Encoding.Unicode.GetBytes("啊");
  i1 = (short)(array[0] - '/0');
  i2 = (short)(array[1] - '/0');
  
  //unicode反解码为汉字
  string str = "4a55";
  string s1 = str.Substring(0,2);
  string s2 = str.Substring(2,2);
  
  int t1 = Convert.ToInt32(s1,16);
  int t2 = Convert.ToInt32(s2,16);
  
  array[0] = (byte)t1;
  array[1] = (byte)t2;
  
  string s = System.Text.Encoding.Unicode.GetString(array);
  
  //default方式反解码为汉字
  array[0] = (byte)196;
  array[1] = (byte)207;
  s = System.Text.Encoding.Default.GetString(array);
  
  //取字符串长度
  s = "iam方枪枪";
  int len = s.Length;//will output as 6
  byte[] sarr = System.Text.Encoding.Default.GetBytes(s);
  len = sarr.Length;//will output as 3+3*2=9
  
  //字符串相加
  System.Text.StringBuilder sb = new System.Text.StringBuilder("");
  sb.Append("i ");
  sb.Append("am ");
  sb.Append("Firekinger");

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值