`
dadi520
  • 浏览: 144777 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

正则表达式入门

阅读更多

出处:   http://gongmingwind.iteye.com/blog/316864

 

 

首先说一下java正则表达式的重点概念: 
第一、相关类:Pattern、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 类的实例用于此目的则不安全。 

第三、正则表达式的构造摘要 
字符类 
[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] 
说明:预定义字符类和字符类部分可以互换。如:[0-9] == \d 

数量词 
X? :X出现一次或一次也没有 
X* :X出现零次或多次 
X+ :X出现一次或多次 
X{n} :X出现恰好 n 次 
X{n,} :X出现至少 n 次 
X{n,m} :X出现至少 n 次,但是不超过 m 次 
例子:a?bc 表示在一个字符串中a出现0次或1次,abc或bc都可以匹配,aabc不可匹配 

捕获组和非捕获组 

组的表示方法: 
捕获组 

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组: 

1     ((A)(B(C))) 
2     \A 
3     (B(C)) 
4     (C) 

组零始终代表整个表达式 

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。 


Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。 



例如 ([" ']).* \1   其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " '  ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。 


非捕获组 

      以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。 

在Java中,支持的非捕获组,有如下几种: 

(?=X)     X,通过零宽度的正 lookahead 即左侧匹配 
(?!X)     X,通过零宽度的负 lookahead 即左侧匹配 
(?<=X)     X,通过零宽度的正 lookbehind 即右侧匹配 
(?<!X)     X,通过零宽度的负 lookbehind 即右侧匹配 
  



这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。 

(?=X ) 
零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 
(?!X) 
零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。 
(?<=X) 
零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。 
(?<!X) 
零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 

说明: 
非捕获组中四个表达式的区别: 
(?=X ) 和(?!X)用于右侧匹配 
(?<=X)和(?<!X)用于左侧匹配 



举例: 

上面都是理论性的介绍,这里就使用一些例子来说明一下问题: 

   1、测试匹配性   (abc)+def(?<!4)56(?=9) 这里的含义就是匹配 以一个或多个abc开头后跟def的文本,而且后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 abcdef5569  ,与abcdef4569不匹配。 



  2 、提取字符串   提取 da12bka3434bdca4343bdca234bm   提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。 
        例如这里就只有3434这个数字满足要求。那么我们怎么提取呢? 

       首先我们写出提取这个字符串的表达式: (?<!c)a(\d+)bd  这里就只有一个捕获组(\d+) 


JAVA代码片段如下:
 

  1. Pattern p = Pattern.compile("(?<!c)a(\\d+)bd");   
  2. Matcher m = p.matcher("da12bca3434bdca4343bdca234bm");   
  3. while(m.find()){   
  4.   System.out.println(m.group(1)); //我们只要捕获组1的数字即可。结果 3434   
  5.   System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd   
  6. }  



可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。 

  1. /** 
  2.  *  
  3.  */  
  4. package cn.com.kn.test;  
  5.   
  6. import java.util.regex.Matcher;  
  7. import java.util.regex.Pattern;  
  8.   
  9. /** 
  10.  * 功能说明: 2009-1-13 上午10:27:44 
  11.  *  
  12.  * @author gmw 
  13.  *  
  14.  */  
  15.   
  16. public class PatternTest {  
  17.       
  18.     public void testParttern(){  
  19.                   //表达式的功能:验证必须为数字(整数或小数)  
  20.         String pattern = "[0-9]+(.[0-9]+)?";  
  21.         //对()的用法总结:将()中的表达式作为一个整体进行处理,必须满足他的整体结构才可以。  
  22.         //(.[0-9]+)? :表示()中的整体出现一次或一次也不出现  
  23.         Pattern p = Pattern.compile(pattern);  
  24.         Matcher m = p.matcher("2");  
  25.         boolean b = m.matches();  
  26.         if(b){  
  27.             System.out.println("istrue:"+b);  
  28.         }  
  29.           
  30.     }  
  31.       
  32.   
  33.     public static void main(String[] args) {  
  34.         PatternTest pt = new PatternTest();  
  35. //      pt.testFormat("2");  
  36.         pt.testParttern();  
  37.           
  38.           
  39.     }  
  40. }  

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    正则表达式入门与提高---整理版_VBa_正则式_

    正则表达式是一种强大的文本处理工具,用于在字符串中...而这份"正则表达式入门与提高---整理版"文档将是你学习正则表达式的好帮手,它涵盖了基础概念、常用模式以及实例解析,是深入理解和运用正则表达式的好资源。

    正则表达式入门经典

    本资源"正则表达式入门经典"是由(美)瓦特编著的扫描版,旨在帮助初学者快速掌握这一技术。 正则表达式的基本概念: 1. **元字符**:如`.`, `*`, `+`, `?`, `{}`, `[]`, `\`, `^`, `$`等,它们具有特殊含义,用来...

    正则表达式入门与提高

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和提取字符串模式。它在各种编程语言和脚本环境...在"正则表达式入门与提高.doc"文档中,你将找到更多实例和详细解释,帮助你深入理解并熟练运用正则表达式。

    正则表达式入门经典.(美)瓦特.扫描版.pdf

    正则表达式入门经典.(美)瓦特.扫描版.pdf 经典书籍

    正则表达式入门经典(书签版)美.瓦特

    《正则表达式入门经典》由美国作家Andrew Watt所著,这本书为初学者提供了全面而详细的正则表达式知识,通过书签版的设置,方便读者快速定位和复习关键概念。 正则表达式的基本结构包括字符、元字符和量词。字符是...

    正则表达式入门经典 带书签

    本资源“正则表达式入门经典”是一本旨在帮助初学者掌握这一强大工具的书籍,通过学习,你可以更好地理解和运用正则表达式。 在编程和数据处理领域,正则表达式扮演着至关重要的角色。它是一种特殊的字符序列,可以...

    正则表达式入门.doc

    在"正则表达式入门.doc"文档中,你将学习到正则表达式的基础知识,包括基本元字符、修饰符、预定义字符类以及更高级的构造。 1. **基本元字符**:正则表达式中最基础的是元字符,它们具有特殊含义,如`.`代表任意...

    正则表达式入门30分钟

    "正则表达式入门30分钟"这个教程可能是为了快速介绍正则表达式的基本概念和常用语法,帮助初学者快速掌握这一强大的工具。下面是一些正则表达式的核心概念和常见用法: 1. **基础元素**: - **字符匹配**:例如,`...

    JS正则表达式入门笔记实例

    这篇入门笔记实例将带你深入了解正则表达式的使用。 1. **正则表达式基础** - **模式定义**:正则表达式由特殊字符(元字符)和普通字符组成,用于描述文本模式。 - **创建方式**:可以使用`/pattern/flags`或`...

    正则表达式入门教程(pdf版

    正则表达式是一种特殊的文本模式,用于在字符串中查找和匹配符合特定规则的子串。它是文本处理不可或缺的工具之一,广泛应用于编程语言、文本编辑器、搜索引擎以及各种编程和脚本语言中。正则表达式的能力远超简单的...

    两本正则表达式入门教程

    这两本入门教程,"正则表达式教程.chm" 和 "正则表达式入门教程.doc",将帮助初学者快速掌握这一技术。 首先,我们来看"正则表达式教程.chm"可能涵盖的内容。CHM是Microsoft的 Compiled HTML Help 文件,通常包含一...

    正则表达式入门指导.ppt

    正则表达式(Regular Expression)是一种强大的文本处理工具,它是一种模式匹配语言,用于在文本中查找、替换或提取符合特定规则的字符串。在多种编程语言中,如Perl、Java、JavaScript、C#、PHP、Python、Ruby、Tcl、...

    正则表达式入门整理chm

    正则表达式语法,句例,口诀,使用详解,教程等等内容

    《学习正则表达式》高清扫描版 PDF

    正物色一本学习正则表达式的入门图书?恭喜,《学习正则表达式》非常适合你!本书提供大量经典简洁的示例,从零开始教你逐步掌握正则表达式。通过匹配特定单词、字符和模式,读者很快就可以自己动手使用正则表达式...

    正则表达式入门教程——30分钟入门

    正则表达式入门教程——正则表达式30分钟入门教程.mht 正则表达式入门教程——正则表达式30分钟入门教程.mht 正则表达式入门教程——正则表达式30分钟入门教程.mht

Global site tag (gtag.js) - Google Analytics