软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 开发杂谈 -> 正则表达式基础和使用及常用表达式 -> 正文阅读

[开发杂谈]正则表达式基础和使用及常用表达式


    何为正则表达式?正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
   1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
   2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
   正则表达式的特点是:
   1. 灵活性、逻辑性和功能性非常的强;
   2. 可以迅速地用极简单的方式达到字符串的复杂控制。
   3. 对于刚接触的人来说,比较晦涩难懂。

    常用的使用情形是对用户的提交或输入的内容进行规则匹配检测,保证内容的合法性。文章分为3个部分,先是基础,然后是Java代码中的使用及相关重要API,最后是常用的正则表达式。其实学会了基础,我们完全可以写出自己定义的规则,写在这里的目的也是为了后期自己在写的时候方便查阅,把它当作一个工具来使用,好了不多说了,那就先说说正则表达式的基础语法吧。
    1,正则表达式的基本语法    
元字符 说明
. 匹配任何单个字符。例如正则表达式“b.g”能匹配如下字符串:“big”、“bug”、“b g”,但是不匹配“buug”。 
$ 匹配行结束符。例如正则表达式“EJB$能够匹配字符串“I like EJB”的末尾,但是不能匹配字符串“J2EE Without EJBs!”。 
^ 匹配一行的开始。例如正则表达式“^Spring”能够匹配字符串“Spring is a J2EE framework”的开始,但是不能匹配“I use Spring in my project”。
* 匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配z以及zoo”;正则表达式“.*”意味着能够匹配任意字符串。
/ 转义符,用来将元字符当作普通的字符来进行匹配。例如正则表达式/$被用来匹配美元符号,而不是行尾;正则表达式/.用来匹配点字符,而不是任何字符的通配符。
[] 匹配括号中的任何一个字符。例如正则表达式“b[aui]g”匹配bugbigbug,但是不匹配beg。可以在括号中使用连字符“-”来指定字符的区间来简化表示,例如正则表达式[0-9]可以匹配任何数字字符,这样正则表达式“a[]c”就可以匹配“a0c”、“a1c”、“a2c”等字符串;还可以制定多个区间,例如“[A-Za-z]”可以匹配任何大小写字母。还有一个相配合使用的元字符“^”,用在这里并不像前边的那个“^”一样表示匹配行开始,而是表示排除,要想匹配除了指定区间之外的字符,就可以在左边的括号和第一个字符之间使用^字符,例如“[^163A-Z]”将能偶匹配除了163和所有大写字母之外的任何字符。
( )  () 之间括起来的表达式定义为”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。
| 将两个匹配条件进行逻辑运算。'z|food' 能匹配 "z"  "food"'(z|f)ood' 则匹配"zood"  "food"
+ 匹配前面的子表达式一次或多次。例如正则表达式9+匹配999999等。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do"  "does" 中的"do" 。此元字符还有另外一个用途,就是表示非贪婪模式匹配,后边将有介绍
{n} 匹配确定的 n 次。例如,“e{2}不能匹配“bed”中的“d”,但是能匹配“seed”中的两个“e”。
{n,} 至少匹配n次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配seeeeeeeed”中的所有“e”。
{n,m} 最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。


     下面是几个例子:
    "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
    "ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
    "ab?":表示一个字符串有一个a后面跟着零个或者一个b;
    "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

    你也可以使用范围,用大括号括起,用以表示重复次数的范围。
    "ab{2}":表示一个字符串有一个a跟着2个b("abb");
    "ab{2,}":表示一个字符串有一个a跟着至少2个b;
    "ab{3,5}":表示一个字符串有一个a跟着3到5个b。

    请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'*','+'和'?'相当于"{0,}","{1,}"和"{0,1}"。
    还有一个'|',表示“或”操作:

    "hi|hello":表示一个字符串里有"hi"或者"hello";
    "(b|cd)ef":表示"bef"或"cdef";
    "(a|b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

    '.'可以替代任何字符:
    "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
    "^.{3}$":表示有任意三个字符的字符串(长度为3个字符);

    方括号表示某些字符允许在一个字符串中的某一特定位置出现:
    "[ab]":表示一个字符串有一个"a"或"b"(相当于"a|b");
    "[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a|b|c|d"或者"[abcd]");
    "^[a-zA-Z]":表示一个以字母开头的字符串;
    "[0-9]%":表示一个百分号前有一位的数字;
    ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。

    你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。
   为了逐字表达,你必须在"^.$()|*+?{\"这些字符前加上转移字符'\'。
   请注意在方括号中,不需要转义字符。
   正则表达式的构造摘要 
构造 匹配 

 
 字符 
  x 字符 x 
  \\ 反斜线字符 
  \0n 带有八进制值 0 的字符 n (0 <= n <= 7) 
  \0nn 带有八进制值 0 的字符 nn (0 <= n <= 7) 
  \0mnn 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) 
  \xhh 带有十六进制值 0x 的字符 hh 
  \uhhhh 带有十六进制值 0x 的字符 hhhh 
  \t 制表符 ('\u0009') 
  \n 新行(换行)符 ('\u000A') 
  \r 回车符 ('\u000D') 
  \f 换页符 ('\u000C') 
  \a 报警 (bell) 符 ('\u0007') 
  \e 转义符 ('\u001B') 
  \cx 对应于 x 的控制符 
  
  字符类 
  [abc] a、b 或 c(简单类) 
  [^abc] 任何字符,除了 a、b 或 c(否定) 
  [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
  [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) 
  [a-z&&[def]] d、e 或 f(交集) 
  [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) 
  [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) 
  
  预定义字符类 
  . 任何字符(与行结束符可能匹配也可能不匹配) 
  \d 数字:[0-9] 
  \D 非数字: [^0-9] 
  \s 空白字符:[ \t\n\x0B\f\r] 
  \S 非空白字符:[^\s] 
  \w 单词字符:[a-zA-Z_0-9] 
  \W 非单词字符:[^\w] 

   

  2,Java代码中的使用
  相关API
    一个Pattern对象就是一个正则表达式经编译后的表现模式,也就是前边所说的“模式编译器”;一个Matcher对象是一个状态机器,它根据Pattern对象做为匹配模式对字符串展开匹配检查,也就是前边说的“模式匹配器”。因为模式的编译过程是最先进行且与匹配过程独立的,所以这保证了进行批量字符串匹配时候的运行效率。
   Pattern类有如下重要的方法:
   (1)public static Pattern compile(String regex):将给定的正则表达式编译并返回编译后的Pattern对象。
   (2)public static Pattern compile(String regex, int flags):将给定的正则表达式编译并返回编译后的Pattern对象,flag参数表示匹配时的选项,可选的flag参数包括:CASE_INSENSITIVE,COMMENTS,MULTILINE,DOTALL,UNICODE_CASE,CANON_EQ。 
   (3)public int flags():返回flag选项参数.
   (4)public static boolean matches(String regex, CharSequence input):直接判断字符序列input是否匹配正则表达regex。前面曾经提到当需要使用一个正则表达式进行多次匹配的时候,对正则表达式进行预编译能够加快运行速度,但是如果这个匹配只进行一次的话,就可以调用这个matches方法直接判断是否匹配,这样就方便多了。这段代码内部的实现代码就是:               
Pattern.compile(regex).matcher(input).matches();

   Matcher 类有如下重要的方法:
   (1)public boolean matches():生成一个给定命名的Matcher对象 
   (2)public String pattern():返回该Pattern对象所编译的正则表达式。 
   (3)public String[] split(CharSequence input)将目标字符序列input按照Pattern里所包含的正则表达式为模式进行分割。 
   (4)public String[] split(CharSequence input, int limit) 将目标字符序列input按照Pattern里所包含的正则表达式为模式进行分割,参数limit作用是指定要分割的段数,如将limi设为2,那么目标字符序列将根据正则表达式分为割为两段。
   (5)public String group(int group) :得到匹配结果中提取的第group个分组的值。此方法在字符串提取中经常用到。
   (6)public String replaceAll(String replacement):用指定的字符串替换匹配的子串。
   指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。 
因此,典型的调用顺序是 

Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();

   在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句

 boolean b = Pattern.matches("a*b", "aaaaab");
   等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。 此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。 
   等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。 此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。 

  
3,常用的表达式

*******************************************************************************
     //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串
    /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/
    ^[a-zA-Z]{1} 表示第一个字符要求是字母。
   ([a-zA-Z0-9]|[._]){4,19} 表示从第二位开始(因为它紧跟在上个表达式后面)的一个长度为4到9位的字符串,它要求是由大小写字母、数字或者特殊字符集[._]组成。
 
*******************************************************************************
    //校验用户姓名:只能输入1-20个以字母开头的字串
    /^[a-zA-Z]{1,20}$/
 
*******************************************************************************
   //校验密码:只能输入6-20个字母、数字、下划线
   /^(\w){6,20}$/
 
\w:用于匹配字母,数字或下划线字符
 
*******************************************************************************
   //校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”
   /^[+]{0,1}(\d){1,3}[]?([-]?((\d)|[ ]){1,12})+$/
 
   \d:用于匹配从0到9的数字;
   “?”元字符规定其前导对象必须在目标对象中连续出现零次或一次
 
*******************************************************************************
   //校验URL
   /^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/(表示url串的长度为length(“https://”)+ n )
 
   \ / :表示字符“/”。
  . 表示所有字符的集
   + 等同于{1,},就是1到正无穷吧。
 
*******************************************************************************
   //校验纯中文字符
  /^[\u4E00-\u9FA5]+$/
  [\u4E00-\u9FA5] :中文字符集的范围
*******************************************************************************

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

  "^([0-9A-F]{2})(-[0-9A-F]{2}){5}$"   //MAC地址的正则表达式
  "^[-+]?\d+(\.\d+)?$"  //值类型正则表达式

......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-04-03 20:46:48  
开发杂谈 最新文章
BloomFilter
大学四年编程之历程
内核分析
造人论坛——意识的本质和一个人工脑模型
OFDM信号[matlab描述]
人类还会进化吗?
HDUACM1035RobotMotion简单模拟题
树、二叉树(二)
iisphpweb.config处理404,500等,跳转友好
DatabaseAsaFortress
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-20 7:28:09
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --