第四天 NET入门初级.NET编程基础(三)正则表达式

"^\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地址!") 
} 
} 

不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下: 

var ip="10.100.20.168" 
ip=ip.split(".") 
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) 



(?<=>)[^>]*(?=<) 


 

字符串的使用(常用方法)

1、字符串的定义
 语法:
  string <name>;
  <name> = <value>;
  或
  string <name> = <value>;

 字符串是引用类型,在定义
  string <name>;
 的时候在栈空间中,定义了一个<name>的空间,该空间存放一个地址
 当写到
  <name> = "The C# Programming Language";
 的时候,会在堆内存分配一个空间,存放字符串"The C# Programming Language",并将首地址赋值给<name>
 因此<name>指向定义的字符串
 
2、字符串的声明
 字符串string对应MSIL(CTS)中的String,实际上是一个类
 那么以前了解到,类需要使用new <构造方法>()来进行实例化,同样字符串也行(这里只介绍一种)
  string <name> = new string(new char[] {...});
 注:这里String与string得到的效果一样
 
 这里有个应用
  字符串是不可变的,在内存中字符串一旦生成,将不会改变
  即使之前使用的str1 + str2也只是生成了另一个字符串
  那么要修改字符串,怎么处理呢?
   这里有个方法
    <strName>.ToCharArray();
   该方法会将字符串,变成一个char类型的数组,因此需要用一个char类型的数组接收

  例:修改一个字符串里面的内容
   char[] ch = <strName>.ToCharArray();
   // 处理字符数组,完成修改目的
   <strName> = new string(ch);

3、字符串可以用索引访问
 字符串,原本就是排在一起的字符,C#提供了用“下标”(索引)来访问字符串中的字符
 例如:
  string str = "jiangkun";
  这里内存中将“j”分配编号0,“i”分配编号1,然后依次增加...
  因此,如果需要访问k,数一数,编号是5,所以可以这么来
   char temp = str[5];
  那么得到的就是字符“k”
 
 字符串也有一个Length属性,可以得到字符串的长度


4、常见的字符串方法

4.1 字符串大小写(字符)
  string <strName>.ToUpper();
  string <strName>.ToLower();
 例:在等待用户输入的时候,常常不考虑用户输入的用户名大小(或一个程序中规定使用的大小写)
  可以将用户的输入全部转换成小写、或大写再来进行比较
  如:
  Console.WriteLine("请输入用户名");
  string uid = Console.ReadLine().ToLower();
  // 再将uid与系统中的数据进行比较

4.2 移除首尾指定字符
  方法原型
   string <strName>.Trim();  // 移除首尾的空格
   string <strName>.TrimStart(); // 移除开头的空格
   string <strName>.TrimEnd();  // 移除结尾的空格
  如果要指定移除的内容,可添加一个char数组作为参数
   string <strName>.Trim(char[] ch);
 
 例:在用户输入的时候,一般不考虑输入两边的空格,而使用Trim()方法

4.3 字符串的比较
 Compare()方法
  方法原型
   int string.Compare(string str1,string str2);
  按照字典排序比较
   当str1 > str2时,返回1
   当str1 = str2时,返回0
   当str1 < str2时,返回-1
  
  注:int string.Compare(string str1,string str2,bool ignoreCase)表示是否区分大小写
   这里true表示不区分大小写,默认为false
 
 Equals()方法
  方法原型
   bool <strName>.Equals(string str);
  比较如果相等返回true,否则返回false
  
  注:bool <strName>.Equals(string str, StringComparison.OrdinalIgnoreCase)表示不区分大小写
 
 注:如果仅仅比较两个字符串是否相等,还是使用“==”比较简单
 例如:
  Console.WriteLine("请输入一个字符串");
  string str1 = Console.ReadLine();
  Console.WriteLine("请输入第二个字符串");
  string str2 = Console.ReadLine();
  // 不考虑大小写的比较
  bool isEqual = str1.ToLower() == str2.ToLower();

4.4 字符串的合并与分割
 合并Join方法
  将数组strArr中的内容拼接成一个字符串,并在对应数组的每两项间添加分隔符str
   string.Join(str,strArr);
  方法原型
   string string.Join(string str,string[] strArr);
 
 字符串分割Split方法
  方法原型:
   string[] <strName>.Split(params char[] separator);
  将字符串<strName>以separator数组中的字符分割,分割后得到的内容存到一个数组中
  
  例:
   // 分析这句话,提取这句话的单词
   string str = "Hello, How are you?";
   string[] words = str.Split(' ',',','?');
  
  注:返回的数组中可以有空字符串项,如果要去掉这些空字符串项,可以使用
   string[] <strName>.Split(char[] separator,StringSplitOptions.RemoveEmptyEntries);

  因此例子可改为
   string str = "Hello, How are you?";
   string[] words = str.Split(new char[]{' ',',','?'},StringSplitOptions.RemoveEmptyEntries);

4.5 字符串查找
  Contains方法
   方法原型:
    bool <strName>.Contains(string str);
   表示字符串<strName>中是否包含str,如果包含,返回true,否则返回false
  例:
   Console.WriteLine("随便输入一串字母");
   string str = Console.ReadLine();
   if(str.Contains("abc"))
   {
    Console.WriteLine("字符串{0}中包含{1}",str,"abc");
   }
   else
   {
    Console.WriteLine("字符串{0}中不包含{1}",str,"abc");
   }
  IndexOf方法
   常用的两种形式:
    int <strName>.IndexOf(string str);     // 从头开始,出现第一次的下标
    int <strName>.IndexOf(string str,int startIndex); // 从startIndex开始,出现第一次的下标
   如果没有找到则返回-1
  例:
   string str = "C#语言基础,讲师蒋坤";
   int res1 = str.IndexOf("蒋坤");
   int res2 = str.IndexOf("蒋 坤");
   Console.WriteLine(res1 + "\n" + res2);
   
   注:LastIndexOf方法从最后一个开始匹配
  
  IndexOpAny方法
   方法原型:
    int <strName>.IndexOfAny(char[] anyOf);
   寻找字符数中的所有内容,返回第一个的位置
   
   同样有两个参数的重载
    int <strName>.IndexOfAny(char[] anyOf, int startIndex);

4.6 求子字符串
  方法原型
   string <strName>.Substring(int startIndex, int length);
  从字符串<strName>的startIndex位置开始提取长度为length的字符串,如果省略第二个参数表示一直到最后

4.7 字符串的插入、移除和替换
 4.7.1 插入
  在字符串<strName>的index位置上插入str,原来的字符依次后移,变成一个新的字符串
   <strName> = <strName>.Insert(index,str);
  方法原型为:
   string <strName>.Insert(int index, string str);
 
 4.7.2 移除
  在字符串<strName>中移除从startIndex开始,长度为length的字符串,剩下的字符按原序合并为一个新的字符串
   <strName> = <strName>.Remove(startIndex,length);
  方法原型为:
   string <strName>.Remove(int startIndex, int length);
  
  注:如果省略第二个参数,将移除startIndex后的所有字符串

 4.7.3 替换
  将字符串<strName>中的oldChar替换为newChar
   <strName> = <strName>.Replace(oldChar,newChar);
  方法原型:
   string <strName>.Replace(char oldChar, char newChar);
  同样,这个替换的字符也可以是字符串
   string <strName>.Replace(string oldValue, string newValue);

4.8 判断结束与开始
  判断字符<strName>串是否以某字符串开始或结束
   bool <strName>.StartsWith(string str);
   bool <strName>.EndsWith(string str);


注:字符串具有不可变性,对字符串的修改,实际上都是重新得到一个字符串,重新赋值

字符串处理练习

课上练习1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出。"abc"→"cba"
课上练习2:接收用户输入的一句英文,将其中的单词以反序输出。"hello c sharp"→"sharp c hello"
课上练习3:从Email中提取出用户名和域名:[email protected]
课上练习4:文本文件中存储了多个文章标题、作者,标题和作者之间用若干空格(数量不定)隔开,每行一个,标题有的长有的短,输出到控制台的时候最多标题长度10,如果超过10,则截取长度8的子串并且最后添加“...”,加一个竖线后输出作者的名字。
让用户输入一句话,找出所有e的位置

 

你可能感兴趣的:(正则表达式)