- 浏览: 296824 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
全站唯一是我么:
请问下该功能的jdk版本是1.4的么,还是以上的?
Java实现给图片添加水印 -
Janne:
请问,你解决这问题没?是怎么回事?我今天也遇到了,没解决
myeclipse6.5中使用jax-ws启动tomcat报错问题 -
xuedong:
studypi 写道你是怎么和新浪的技术联系的?能告诉一下我吗 ...
新浪微博第三方接口调用学习 -
studypi:
你是怎么和新浪的技术联系的?能告诉一下我吗,谢谢
新浪微博第三方接口调用学习 -
dove19900520:
有用,呵呵
IE,Firefox都不放弃(兼容性问题总结)
1 概述
初学正则时,对于Regex类不熟悉,遇到问题不知道该用哪种方法解决,本文结合一些正则应用的典型应用场景,介绍一下Regex类的基本应用。这里重点进行.NET类的介绍,对于正则的运用,不做深入探讨。
正则的应用最终都是进行模式的匹配,而根据目的的不同,基本上可以分为以下几种应用:验证、提取、替换、分割。结合.NET提供的控件、类以及类的方法,可以很方便的实现这些应用。
以下将结合一些典型的应用场景,对.NET中常见的类、方法及属性进行介绍。本文旨在.NET类基础用法的引导,对于其中涉及到的正则表达式不做深入探讨。本文适合于在.NET平台下使用正则的初学者。
2 基础应用
2.1 验证
验证的目的是为了判断输入的源字符串是否符合某一规律或规则,根据需求的不同,可能是校验整个源字符串,也可能只是校验其中一个子串。
验证在.NET中一般有两种应用,一种是在验证控件RegularExpressionValidator中,另一种是在程序中。
2.1.1 验证控件RegularExpressionValidator
RegularExpressionValidator是.NET自带的一种客户端验证控件,通过简单的设置,即可完成对某控件输入值的校验。
基本应用语法如下:
<asp:RegularExpressionValidator
ID="RegularExpressionValidator1"
runat="server"
ControlToValidate="TextBox1"
ErrorMessage="RegularExpressionValidator"
ValidationExpression="^([1-9][0-9]*|0)(/.[0-9][2])?$">
</asp:RegularExpressionValidator>
对于RegularExpressionValidator控件不做过多介绍,只是说明一下使用时需要注意的几点:
1、 RegularExpressionValidator进行的是客户端验证;
2、 RegularExpressionValidator中正则使用的是JavaScript语法规则;
3、 RegularExpressionValidator控件不能验证输入是否为空。
由于RegularExpressionValidator做的是客户端验证,很容易被跳过,所以在使用RegularExpressionValidator验证的同时,还要做服务器端验证。
RegularExpressionValidator最终是要生成客户端的JavaScript代码进行验证的,所以RegularExpressionValidator使用的正则要求符合JavaScript语法规则,与.NET的几点区别:
1、 不支持逆序环视,也就是(?<=Expression)和(?<!Expression)这样的语法;
2、 元字符仅支持ASCII码,即/w等价于[a-zA-Z0-9_],/d等价于[0-9]
RegularExpressionValidator控件一般是用来验证某一控件输入的字符串整体是否符合某一规则的,所以通常情况下“^”和“$”是必不可少的;在使用“|”表示“或”的关系时,一定要用“()”来限定“|”作用范围,比如0-100可以写作“^([1-9]?[0-9]|100)$”。
RegularExpressionValidator是不能验证输入是否为空的,验证是否为空要用RequiredFieldValidator控件。
RegularExpressionValidator验证控件是.NET为方便客户端验证封装的一组验证控件之一,但由于RegularExpressionValidator受限于支持的正则语法规则,只能做有限的格式校验,一些复杂的校验可以通过自己写JavaScript代码来实现,也是很简单的。
2.1.2 程序验证——IsMatch()
程序中的校验基本上就是使用IsMatch方法,验证的对象可能是源字符串的整体,也可能只是其中一个子串。
验证源字符串的整体是否符合某一规则,与使用RegularExpressionValidator时的需求基本上一致,不过由于是在.NET程序中,所以使用的是.NET的语法,比JavaScript中要强大得多。比如验证一个文本框输入的字符串是否符合某一规则,就是一个典型的验证整体的需求。
举例1:验证textBox1输入内容,要求整数部分为0或正整数,小数可有可无,有小数时必须为2位。
Regex reg = new Regex(@"^(?:[1-9][0-9]*|0)(?:/.[0-9]{2})?$");
if (reg.IsMatch(textBox1.Text))
{
richTextBox2.Text = "输入格式正确!";
}
else
{
richTextBox2.Text = "输入格式错误!";
}
由于是对源字符串的整体进行验证,所以“^”和“$”是必不可少的。否则验证的结果可能是错误的,比如正则表达式“(?:[1-9][0-9]*|0)(?:/.[0-9]{2})?”,在输入“0.123”时是可以匹配成功的,匹配结果为“0.12”,此时正则只起到了匹配的作用,没有起到验证的作用。
验证源字符串的局部是否符合某一规则,就是对于源字符串中子串的校验,通常是用来判断源字符串中是否包含,或是不包含符合某一规律的子串,作用类似于string类中的IndexOf。
举例2(参考问两个正则表达式):
数据:
1985aaa1985bb
bcae1958fiefadf1955fef
atijc1944cvkd
df2564isdjfef2564d
abc1234def5678ghi5678jkl
需求1:验证字符串中任意位置出现的连续四个数字在整个字符串中是否有重复,有重复为True,无重复为False。
以上数据需求1的验证结果为True的应为:
1985aaa1985bb
df2564isdjfef2564d
abc1234def5678ghi5678jkl
因为需求中指明是任意位置的连续4个数字是否有重复,所以在找到重复前,要遍历源字符串中每一个位置时行验证,这样就不能限定开始标识符“^”;而在匹配过程中,除非一直到结尾仍找不到重复,否则只要匹配到有重复的位置就可以了,这样也不需要结束标识符“$”,所以这是典型的对字符串的子串行验证的需求。
代码实现:
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d", "abc1234def5678ghi5678jkl" };
Regex reg = new Regex(@"(/d{4})(?:(?!/1).)*/1");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + reg.IsMatch(s) + "/n";
}
/*--------输出--------
源字符串: 1985aaa1985bb 验证结果: True
源字符串: bcae1958fiefadf1955fef 验证结果: False
源字符串: atijc1944cvkd 验证结果: False
源字符串: df2564isdjfef2564d 验证结果: True
源字符串: abc1234def5678ghi5678jkl 验证结果: True
*/
由于涉及到了重复问题,所以这里用到了反向引用,对于反向引用的细节,可以参考正则基础之——反向引用。
需求2:验证字符串中第一个出现的连续4个数字是否有重复,有重复为True,无重复为False。
以上数据需求2的验证结果为True的应为:
1985aaa1985bb
df2564isdjfef2564d
因为需求中指明是第一个是否有重复,所以需要有开始标识符“^”,来保证是第一个出现的连续4个数字;而在匹配过程中,除非一直到结尾仍找不到重复,否则只要匹配到有重复的位置就可以了,这样也不需要结束标识符“$”,所以这仍是对字符串的子串行验证的需求,只不过相对于需求1来说,加了一个限定条件。
代码实现:
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d", "abc1234def5678ghi5678jkl" };
Regex reg = new Regex(@"^(?:(?!/d{4}).)*(/d{4})(?:(?!/1).)*/1");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + reg.IsMatch(s) + "/n";
}
/*--------输出--------
源字符串: 1985aaa1985bb 验证结果: True
源字符串: bcae1958fiefadf1955fef 验证结果: False
源字符串: atijc1944cvkd 验证结果: False
源字符串: df2564isdjfef2564d 验证结果: True
源字符串: abc1234def5678ghi5678jkl 验证结果: False
*/
2.2 提取——Match()、Matches()
提取主要是从源字符串中,取得一个或多个符合某一规律或规则的子串。一般来说,在字符串处理中,提取应用比较广泛。提取时用得比较多的是Match()和Matches()方法,以及结果处理时Match类和MatchCollection类的一些方法,有时也会用到Capture类的一些方法。
2.2.1 提取单次匹配内容——Match()
当需要提取的内容只有一个,或是只需要获取第一次成功匹配的内容时,可以使用Match()方法。当使用Match()方法时,只要在某一位置匹配成功,就不再继续尝试匹配,并返回一个Match类型的对象。
举例:提取姓名
源字符串:姓名:张三,性别:男,年龄:25
代码实现:
string test = "姓名:张三,性别:男,年龄:25";
Regex reg = new Regex(@"(?<=姓名:)[^,]+");
Match m = reg.Match(test);
if (m.Success) //验证是否匹配成功
{
richTextBox2.Text = m.Value;
}
/*--------输出--------
张三
*/
虽然Match()只是取一次匹配,但是可以通过捕获组来获取多个指定子串,比如获取第一个<a…>标签的链接和文本。
string test = "abc<a href=/"www.test1.com/">测试一</a>def<a href=/"www.test2.com/">测试二</a>ghi";
Regex reg = new Regex(@"(?is)<a(?:(?!href=).)href=(['""]?)(?<url>[^""/s>]*)/1[^>]*>(?<text>(?:(?!</?a/b).)*)</a>");
Match m = reg.Match(test);
if(m.Success)
{
richTextBox2.Text += m.Groups["url"].Value + "/n"; //链接
richTextBox2.Text += m.Groups["text"].Value + "/n"; //文本
}
/*--------输出--------
www.test1.com
测试一
*/
对于捕获组捕获结果的引用,还有一种方式
string test = "abc<a href=/"www.test1.com/">测试一</a>def<a href=/"www.test2.com/">测试二</a>ghi";
Regex reg = new Regex(@"(?is)<a(?:(?!href=).)href=(['""]?)(?<url>[^""/s>]*)/1[^>]*>(?<text>(?:(?!</?a/b).)*)</a>"); Match m = reg.Match(test);
if(m.Success)
{
richTextBox2.Text += m.Result("${url}") + "/n"; //链接
richTextBox2.Text += m.Result("${text}") + "/n"; //文本
}
/*--------输出--------
www.test1.com
测试一
*/
这两种方法获取的结果都是一样的,使用哪一种,通常根据个人习惯而定。
2.2.2 提取多次匹配内容——Matches()
当需要提取的内容有多个,并且需要提取所有符合规律的子串时,可以使用Matches()方法。当使用Matches()方法时,需要遍历源字符串的每一个位置进行尝试匹配,匹配结束返回一个MatchCollection类型的对象。
对于1.2.1节提到的提取链接和文本的例子,如果提取的是全部链接和文本,而不仅仅是第一个时,可以使用Matches()方法。
string test = "abc<a href=/"www.test1.com/">测试一</a>def<a href=/"www.test2.com/">测试二</a>ghi";
Regex reg = new Regex(@"(?is)<a(?:(?!href=).)href=(['""]?)(?<url>[^""/s>]*)/1[^>]*>(?<text>(?:(?!</?a/b).)*)</a>");
MatchCollection mc = reg.Matches(test);
foreach(Match m in mc)
{
richTextBox2.Text += m.Groups["url"].Value + "/n"; //链接
richTextBox2.Text += m.Groups["text"].Value + "/n"; //文本
}
/*--------输出--------
www.test1.com
测试一
www.test2.com
测试二
*/
对于Matches(),某些场景下,也可以通过Count属性,用做统计符合某一规律的子串出现的次数,例如统计字符串中独立的“3”出现的次数。
string test = "137,1,33,4,3,6,21,3,35,93,2,98";
Regex reg = new Regex(@"/b3/b");
int count = reg.Matches(test).Count; //2
这时候关心的只是匹配成功的次数,对于匹配的内容是不关心的,所以实现这种需求时,正则应尽量简洁,能达到目的即可,这样可以加快匹配效率,减少资源占用。比如上面的提取链接的源字符串中,统计<a…>标签出现的次数,一般来说,如下代码即可达到目的了。
string test = "abc<a href=/"www.test1.com/">测试一</a>def<a href=/"www.test2.com/">测试二</a>ghi";
Regex reg = new Regex(@"(?i)<a/b");
int count = reg.Matches(test).Count; //2
2.2.3 捕获组匹配过程集合——Capture
在某些情况下,一个正则表达式整体匹配一次时,其中的捕获组可能会匹配多次。
举例:
源字符串:<region name=oldslist col=1 row=2 order=asc>abcsadf </region> jfdsajf <region name=newslist class=list col=4 row=10 order=desc>abcsadf </region>
需求:提取出每个region的属性和属性值,按region分组。
对于这个需求,可以先提取出所有region,再对每个region标签提取它的属性和属性值,但这样做比较麻烦,可以考虑在一个正则表达式中提取。由于属性的个数是不固定的,所以不能用固定个数的量词来匹配属性对,正则可以写为
(?is)<region/s+(?:(?<key>[^/s=]+)=(?<value>[^/s>]+)/s*)+>
此时如果还用Groups来取匹配结果时,由于Groups只保留最后一次匹配结果,所以只能取到最后一次匹配成功的子串。这时就要用到Captures属性。
string test = "<region name=oldslist col=1 row=2 order=asc>abcsadf </region> jfdsajf <region name=newslist class=list col=4 row=10 order=desc>abcsadf </region>";
MatchCollection mc = Regex.Matches(test, @"(?is)<region/s+(?:(?<key>[^/s=]+)=(?<value>[^/s>]+)/s*)+>");
for (int i = 0; i < mc.Count; i++)
{
richTextBox2.Text += "第" + (i + 1) + "个region的属性:/n";
for (int j = 0; j < mc[i].Groups["key"].Captures.Count; j++)
{
richTextBox2.Text += "属性: " + mc[i].Groups["key"].Captures[j].Value.PadRight(10, ' ') + " 值: " + mc[i].Groups["value"].Captures[j].Value + "/n";
}
richTextBox2.Text += "/n";
}
/*--------输出--------
第1个region的属性:
属性: name 值: oldslist
属性: col 值: 1
属性: row 值: 2
属性: order 值: asc
第2个region的属性:
属性: name 值: newslist
属性: class 值: list
属性: col 值: 4
属性: row 值: 10
属性: order 值: desc
*/
Group实际上是Capture的一个集合,在捕获组只匹配一个子串时,这个集合只有一个元素,而在捕获组先后匹配多个子串时,Groups[i].Value只保留最后一个匹配结果,而Capture集合却可以记录匹配过程中匹配到的所有子串。
Capture的应用场景并不多,对于上面的例子,如果不使用 Capture,可以通过分次匹配的方式实现,但是在一些复杂的表达式中,很难进行分次匹配,这时Capture就比较有用了。
2.3 替换
替换主要是从源字符串中,将符合某一规律或规则的子串替换为其它内容。一般来说,在字符串处理中,替换应用也比较广泛。替换主要是用Replace()方法,在一些替换规则复杂的应用场景中,也可能会用到委托方法。
2.3.1 一般替换
替换的目的很明确,只要找出待替换子串的规律,替换为目标子串就可以了。
举例1:
源字符串:<img src="/imgs/logo.jpg"> abc <img src="http://www.test.com/imgs/top.gif">
需求:将相对地址替换为绝对地址,已经是绝对地址的不替换。
string test = "<img src=/"/imgs/logo.jpg/"> abc <img src=/"http://www.test.com/imgs/top.gif/">";
Regex reg = new Regex(@"(?i)(?<=src=(['""]?))(?!http://)(?=[^'""/s>]+/1)");
string result = reg.Replace(test, "http://www.test.com");
/*--------输出--------
<img src="http://www.test.com/imgs/logo.jpg"> abc <img src="http://www.test.com/imgs/top.gif">
*/
这里需要说明的是,在.NET中只提供了一个Replace()方法,没有提供类似于Java中的replaceAll()和replaceFirst()两种方法,所以如果在.NET中只替换第一次出现的符合规律的子串时,需要在正则表达式中处理。
举例2:
源字符串:abc123def123ghi
需求:将第一次出现的“123”替换为空,其余位置不替换。
string test = "abc123def123ghi";
Regex reg = new Regex(@"(?s)^((?:(?!123).)*)123");
string result = reg.Replace(test, "$1");
/*--------输出--------
abcdef123ghi
*/
这时用“^”限定只替换第一次出现的子串,由于绝大多数正则引擎都对“^”进行了优化,所以正则表达式在位置0处匹配成功或失败后,将不再对其它位置进行尝试匹配。
2.3.2 替换中的委托方法应用
对于一些比较复杂的替换规则,可能会用到委托方法,由于这种应用属于比较典型的一种应用,所以将在后面的文章中单独进行介绍。
2.4 分割
分割就是用符合某一规律的子串,将源字符串分割成一个数组,主要用到的是Split()方法。由于Regex的Split()方法中,并没有提供类似于string的Split()方法的StringSplitOptions.RemoveEmptyEntries参数,而如果符合规律的子串出现在开头或结尾时,会出现不需要的空串,这时需要在正则表达式中进行一下处理。
举例1:
源字符串:汉字123文字english
需求:按英文单词和非英文单词进行分割(英文单词包括由a-z,A-Z,0-9,_组成的子串)。
string str = "汉字123文字english";
string[] result = Regex.Split(str, @"(?<!^)/b(?!$)", RegexOptions.ECMAScript);
foreach (string s in result)
{
richTextBox2.Text += s + "/n";
}
/*--------输出--------
汉字
123
文字
English
*/
这里分别用“(?<!^)”和“(?!$)”来限定不以开头或结尾的子串进行分割,结果中也就不会出现不必要的空串了。
还有一些应用,其实可以算作是正则就用技巧范畴的了。
举例2:
源字符串:Left(姓名,1),Left(姓名,1) , Left (姓名,1)
需求:以不在“()”内的“,”进行分割。
string test = "Left(姓名,1),Left(姓名,1) , Left (姓名,1)";
Regex reg = new Regex(@"(?<!/([^)]*),(?![^(]*/))");
string[] sArray = reg.Split(test);
foreach (string s in sArray)
{
richTextBox2.Text += s + "/n";
}
/*--------输出--------
Left(姓名,1)
Left(姓名,1)
Left (姓名,1)
*/
使用正则的Split()方法时,有一点需求注意,那就是如果正则中出现了捕获组,那么捕获组匹配到的内容也会保存到分割结果中。
以下举例不做详细说明,看下结果基本上就明白了。
string test = "aa11<bbb>cc22<ddd>ee";
string[] temp = Regex.Split(test, @"[0-9]+(<[^>]*>)");
foreach (string s in temp)
{
richTextBox2.Text += s + "/n";
}
/*--------输出--------
aa
<bbb>
cc
<ddd>
ee
*/
如果不想把捕获组匹配到的内容也存入结果,可以使用非捕获组。
string test = "aa11<bbb>cc22<ddd>ee";
string[] temp = Regex.Split(test, @"[0-9]+(?:<[^>]*>)");
foreach (string s in temp)
{
richTextBox2.Text += s + "/n";
}
/*--------输出--------
aa
cc
ee
*/
3 扩展应用
这里介绍一些可能涉及到的一些.NET中的正则扩展应用。
3.1 动态生成正则时的转义——Escape()
有时需要根据一些变量动态生成正则表达式,这时如果变量中含有正则中的元字符,会被解析成元字符,就可能会导致正则编译不通过,从而导致程序异常,需要对变量进行转义处理。Regex. Escape()方法通过替换为转义码来转义最小的字符集(/、*、+、?、|、{、[、(、)、^、$、.、# 和空白)。
比如根据用户输入的id取相应的div标签,id中没有元字符时,可以取得正确结果。
string test = "<div id=/"test1/">abc</div><div id=/"test2/">def</div>";
string[] ids = new string[] { "test1", "test2" };
foreach (string id in ids)
{
Regex reg = new Regex(@"(?is)<div/s+id=""" + id + @"""[^>]*>(?:(?!</?div/b).)*</div>");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
}
}
/*--------输出--------
<div id="test1">abc</div>
<div id="test2">def</div>
*/
但是如果输入的id中一旦出现未经转义的元字符,如“abc(”,就会抛类似于下面的异常。
正在分析“(?is)<div/s+id="abc("[^>]*>(?:(?!</?div/b).)*</div>”- ) 不足。
此时可以用Escape()方法对输入的变量进行转义处理。
string test = "<div id=/"test1/">abc</div><div id=/"test2/">def</div>";
string[] ids = new string[] { "test1", "test2", "abc(" };
foreach (string id in ids)
{
Regex reg = new Regex(@"(?is)<div/s+id=""" + Regex.Escape(id) + @"""[^>]*>(?:(?!</?div/b).)*</div>");
MatchCollection mc = reg.Matches(test);
foreach (Match m in mc)
{
richTextBox2.Text += m.Value + "/n";
}
}
/*--------输出--------
<div id="test1">abc</div>
<div id="test2">def</div>
*/
使用Escape()方法转义后,就可以得到正确的结果,而不会抛异常了。
3.2 静态方法
.NET中一些Regex类的常见方法都提供了相应的静态方法,可以不显式的声明Regex对象,而直接调用相应的方法,书写起来更方便,代码更简洁、易读。
比如替换IP地址最后一节为“*”,只需一行代码。
string result = Regex.Replace("10.27.123.12", @"/d+$", "*"); //10.27.123.*
静态方法每次调用都会创建一个临时的Regex对象,使用之后释放,所以每次调用静态方法时,都会重新编译,而这将会降低执行效率。因此在循环或是频繁调用的方法中,不适合使用静态方法,而需要进行显式声明Regex对象。
但是对于一些只调用一次,或是对执行效率没有要求的场景下,静态方法则是很不错的选择。
转自:http://blog.csdn.net/lxcnn/article/details/4656599
发表评论
-
(从网上考过来的,收藏) javascript 正则表达式的贪婪与非贪婪
2012-10-08 10:35 887以下内容转自:http://www.cnitblog.com ... -
正则表达式常用验证
2011-08-24 12:20 855在前台很多地方需要验证输入格式,为了方便以后使用,把常用的整理 ... -
正则判断一个字符串里是否包含一些词
2011-08-16 16:53 3266今天项目里用到了正则,判断一个字符串里是不是包含这些词,词出 ... -
js取当前url参数
2011-07-19 11:14 1944js没有提供取当前url参数的方法,只能是自己从中截取了,在 ... -
正则手册
2011-07-07 16:53 1026给大家共享个正则手册 欢迎查看本人博客: ... -
[ ] 字符组(Character Classes) .
2011-07-06 17:31 821[]能够匹配所包含的一系列字符中的任意一个。需要注意的是,[ ... -
正则基础之——捕获组(capture group) .
2011-07-06 17:30 10011 概述 1.1 什么是捕获组 ... -
正则表达式学习参考
2011-07-06 17:28 769正则表达式学习参考 1 ... -
正则基础之——小数点 .
2011-07-06 17:23 791小数点可以匹配除了换行符“/n”以外的任意一个字符 一 ... -
正则基础之——NFA引擎匹配原理 .
2011-07-06 17:22 999NFA引擎匹配原理 1 ... -
正则基础之——环视 .
2011-07-06 17:21 569环视只进行子表达式的匹配,不占有字符,匹配到的内容不保存到最终 ... -
正则基础之——/b 单词边界 .
2011-07-06 17:20 8231 概述 “/b”匹配单词边界,不匹配任何 ... -
正则应用之——日期正则表达式
2011-07-06 17:18 10701 概述 首先需要说明的一点,无论是Win ... -
.NET正则基础之——.NET正则匹配模式 .
2011-07-06 17:16 23301 概述 匹配模式指的是一些可以改变正则表 ... -
.NET正则基础之——平衡组 .
2011-07-06 17:14 18151 概述 平衡组是微软在.NET中提出的一 ... -
正则基础之——非捕获组 .
2011-07-06 17:10 1364非捕获组:(?:Expression) 接触正则表达式不久的 ... -
正则基础之——反向引用 .
2011-07-06 17:09 13191 概述 捕获组捕获到的内容,不仅可以在 ... -
NET正则基础之——正则委托 .
2011-07-06 17:05 8411 概述 一般的正则替换,只能对匹配的子串做 ... -
正则基础之——贪婪与非贪婪模式 .
2011-07-06 17:03 9541 概述 贪婪 ... -
正则应用之——逆序环视探索
2011-07-06 17:01 12091 问题引出 前几天在CSDN论坛遇到这样 ...
相关推荐
使用.NET正则表达式... 413 正则表达式快速入门... 413 包概览... 415 核心对象概览... 416 核心对象详解... 418 创建Regex对象... 419 使用Regex对象... 421 使用Match对象... 427 使用Group对象... 430 ...
在.NET框架中,`DateTime`类是用于处理日期和时间的核心类。它支持从`0001-01-01 00:00:00`到`9999-12-31 23:59:59`的时间范围。对于UNIX时间戳,它是从1970年1月1日00:00:00起算的秒数,而`DateTime`类可以方便地...
基础教程——C#案例版.pdf 17.7MB 6.ASP.NET技术内幕.pdf 80.5MB 7.C#.COM..编程指南.pdf 3.2MB 8.C#编程思想.pdf 8.1MB 9.C#编程语言详解.pdf 23.2MB 10.C#程序员参考手册.pdf 15MB 11.C#高级编程(第4...
日期正则表达式是用于匹配和验证日期格式的正则模式,它在计算机科学和编程领域,特别是IT中的文本处理和数据验证方面有着广泛应用。在处理日期时,我们经常需要确保日期符合特定的格式和有效性规则,以防止数据错误...
这个压缩包“ASP.NET源码——UrlRewriter .NET v1.8 (For .net1.1).zip”包含了UrlRewriter .NET v1.8版本的源代码,专为.NET Framework 1.1版本设计。UrlRewriter是一个强大的URL重写模块,它允许开发者对网站的URL...
ASP.NET是一种基于.NET Framework的服务器端编程模型,用于构建动态Web应用程序。在ASP.NET中,Global.asax文件是一个特殊的应用程序全局事件处理程序,它允许开发者捕获和响应应用程序级别的事件,如请求开始、结束...
【ASP.NET源码——bob5百度百科小偷程序 (asp.net2.0).zip】是一个包含ASP.NET开发的源代码项目,主要用于从百度百科抓取并展示数据的程序。这个程序利用了ASP.NET 2.0框架,一个由微软推出的用于构建Web应用程序的...
这个"ASP.NET源码——新闻采集器源码.zip"压缩包包含了一个新闻采集器的源代码,它可以帮助我们理解如何在ASP.NET环境中实现数据抓取和处理功能。 新闻采集器的主要目标是从网络上抓取新闻数据,这通常涉及到以下几...
这个"ASP.NET源码——UrlRewriter.NET地址重写示例程序3阶段.zip"文件很可能是为了逐步指导开发者理解并掌握如何使用UrlRewriter.NET进行URL重写。 首先,URL重写是Web开发中的一个重要概念,它涉及将请求的原始URL...
总的来说,"ASP.NET源码——UrlRewriter .NET v2.0 RC1 (For .Net2.0)"是一个非常有价值的资源,对于那些想要提升网站用户体验、改善SEO,或是深入研究ASP.NET URL重写机制的开发者来说尤其如此。通过理解和应用这个...
1. **基础应用**:最常见的用途之一是匹配单个单词而不匹配其作为更长单词的一部分的情况。例如,在文本中查找并替换单词“to”,但不包括单词“today”。 **示例代码**: ```csharp string text = "I want to...
本文将深入探讨ASP.NET正则表达式的基本概念、常用方法以及实际应用示例。 1. 正则表达式基础 - 正则表达式是一种模式匹配语言,通过特定的字符序列来描述字符串的模式。 - 常见的元字符如`^`(开始)、`$`(结束...
此压缩包"ASP.NET源码——Asp.net汉字转拼音(全).zip"包含的源代码着重于一个特定的功能:将汉字转换为拼音,这对于开发具有中文支持的应用程序,尤其是搜索引擎优化或无障碍访问功能来说非常有用。 在ASP.NET中,...
【ASP.NET 源码——[搜索链接].NET搜索引擎(带蜘蛛)】 ASP.NET 是微软公司推出的一种基于.NET Framework的Web应用程序开发平台,它提供了丰富的控件、强大的数据访问功能以及高度可扩展的架构,使得开发者能够快速...
ASP.NET 是微软公司开发的一种用于构建 Web 应用程序的框架,它基于 .NET Framework,提供了丰富的功能和组件,使得开发者能够快速、高效地构建动态网站、Web 应用和服务。此压缩包“ASP.NET源码——身份证号码验证...
ASP.NET 是一种由微软开发的服务器端Web应用程序框架,它为构建动态、数据驱动的Web应用提供了丰富的功能和工具。这个"ASP.NET源码——Ajax之用户注册实例.zip"文件包含了一个具体的用户注册示例,它利用了Ajax技术...
【ASP.NET源码——bob5百度知道小偷.zip】是一个包含ASP.NET开发的源代码项目的压缩包,项目名称为“bob5百度知道小偷”。这个项目可能是为了抓取和展示百度知道平台上的问答数据而设计的。在深入讨论之前,先来了解...
在这个“ASP.NET源码——[聊天留言]荒野留言簿.zip”压缩包中,我们可以期待找到一个基于ASP.NET实现的简单在线聊天或留言簿应用的源代码。这个应用可能包含用户交互、数据存储以及后台处理等功能,是学习和理解ASP...
ASP.NET是一种基于.NET框架的服务器端编程模型,由微软公司开发,主要用于构建Web应用程序。它提供了丰富的功能,如内置的安全性、状态管理、缓存机制和可扩展的架构,使得开发者能够快速、高效地开发出动态网站、...