`
ln_ydc
  • 浏览: 270794 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

Java中的正则表达式

    博客分类:
  • Java
 
阅读更多

 

 参考:http://deerchao.net/tutorials/regex/regex.htm

package com.ydc.ln.codebase.java.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 参考:http://deerchao.net/tutorials/regex/regex.htm
 * 
 * @ClassName RegexDemo
 * @Description TODO
 * @author ydc
 * @date 下午8:46:14 2013-3-15
 * @version V1.0
 */
public class RegexDemo {
	// ------------------------------------------
	// 元字符
	// ------------------------------------------
	/**
	 * hi后面不远处跟着一个Lucy : (\b)(.)(*)
	 */
	public static String pat01 = "\bhi\b.*\bLucy\b";

	/**
	 * 中国的电话号码:(\d)
	 */
	public static String pat02 = "0\\d\\d-\\d\\d\\d\\d\\d\\d\\d\\d";

	public static String pat02_1 = "0\\d{2}-\\d{8}";

	/**
	 * 以字母a开关的单词
	 */
	public static String pat03 = "\\ba\\w*\\b";

	/**
	 * 匹配刚好6个字符的单词
	 */
	public static String pat04 = "\\b\\w{6}\\b";

	/**
	 * 匹配QQ号
	 */
	public static String pat05 = "^\\d{5,12}$";

	// ------------------------------------------
	// 字符转义
	// ------------------------------------------

	/**
	 * 查找元字符(.) 匹配deerchao.net
	 */
	public static String pat06 = "deerchao\\.net";

	/**
	 * 匹配C:\Windows 注意(\)也需要转义
	 */
	public static String pat07 = "C:\\\\Windows";

	// ------------------------------------------
	// 重复
	// ------------------------------------------
	/**
	 * Windows后面跟1个或更多数字
	 */
	public static String pat08 = "Windows\\d+";

	/**
	 * 匹配一行(或整个字符串)的第一个单词
	 */
	public static String pat09 = "^\\w+";

	// ------------------------------------------
	// 字符类
	// ------------------------------------------
	/**
	 * 匹配任何一个英文元音字母
	 */
	public static String pat10 = "[aeiou]";

	/**
	 * 匹配标点符号(.?!)
	 */
	public static String pat11 = "[.?!]";

	/**
	 * 一位数字:与(\d)代表含意一样
	 */
	public static String pat12 = "[0-9]";

	/**
	 * 只考虑英文,等同于(\w)
	 */
	public static String pat13 = "[a-zA-Z0-9]";

	/**
	 * 匹配几种格式的电话号码
	 */
	public static String pat14 = "\\(?0\\d{2}[) -]?\\d{8}";

	// ------------------------------------------
	// 分枝条件:正则表达式里的分枝条件指的是有几种规则,
	// * 如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开
	// ------------------------------------------
	/**
	 * 匹配两种以连字号分隔的电话号码
	 * <p>
	 * 一种是三位区号,8位本地号 一种是四位区号,7位本地号
	 * </p>
	 */
	public static String pat15 = "0\\d{2}-\\d{8}|0\\d{3}-\\d{7}";

	/**
	 * 匹配3位区号的电话号码:
	 * <p>
	 * 其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔
	 * </p>
	 */
	public static String pat16 = "\\(?0\\d{2}\\)?[- ]?\\d{8}|0\\d{2}[- ]?\\d{8}";

	/**
	 * 匹配美国的邮政编码
	 * <p>
	 * 使用分枝条件时,要注意各个条件的顺序。
	 * 
	 * 如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。
	 * 
	 * 原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
	 * </p>
	 */
	public static String pat17 = "\\d{5}-\\d{4}|\\d{5}";

	// ------------------------------------------
	// 分组
	// ------------------------------------------

	/**
	 * 匹配简单的IP地址地址
	 */
	public static String pat18 = "(\\d{1,3}\\.){3}\\d{1,3}";

	/**
	 * 正确的IP地址
	 */
	public static String pat19 = "((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)";

	// ------------------------------------------
	// 反义
	// * 查找不是某个字符或不在某个字符类里的字符的方法(反义)
	// ------------------------------------------

	/**
	 * 不包含空白符的字符串
	 */
	public static String pat20 = "\\S+";

	/**
	 * 用尖括号括起来的以a开头的字符串
	 */
	public static String pat21 = "<a[^>]+>";

	// ------------------------------------------
	// 后向引用 使用小括号指定一个子表达式后,匹配这个子表达式的文本
	// * 后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本
	// ------------------------------------------

	/**
	 * 匹配重复的单词,如:go go,或kitty kitty
	 */
	public static String pat22 = "\\b(\\w)\\b\\s+\\1\\\b";

	/**
	 * 指定子表达式的组名
	 * <p>
	 * 把(\\w+)的组名指定为Word了
	 * 
	 * (\k<Word>)引用这个分组捕获
	 * 
	 * 尖括号可以换成('):(?'Word'\w+)
	 * </p>
	 * 
	 */
	public static String pat23 = "(?<Word>\\w+)\\b\\s+\\k<Word>\\b";

	// ------------------------------------------
	// 零宽断言
	// ------------------------------------------
	/**
	 * (?=exp)也叫零宽度正预测先行断言
	 * 
	 * 以ing结尾的单词的前面部分(除了ing以外的部分)
	 * <p>
	 * 如查找I'm singing while you're dancing.时,它会匹配sing和danc。
	 * </p>
	 */
	public static String pat24 = "\\b\\w+(?=ing\\b)";

	/**
	 * (?<=exp)也叫零宽度正回顾后发断言
	 * 
	 * 以re开头的单词的后半部分(除了re以外的部分)
	 * <p>
	 * 如在查找reading a book时,它匹配ading。
	 * </p>
	 */
	public static String pat25 = "(?<=\\bre)\\w+\\b";

	/**
	 * 给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)
	 * <p>
	 * 用它对1234567890进行查找时结果是234567890。
	 * </p>
	 */
	public static String pat26 = "((?<=\\d)\\d{3})+\\b";

	/**
	 * 匹配以空白符间隔的数字(再次强调,不包括这些空白符)。
	 */
	public static String pat27 = "(?<=\\s)\\d+(?=\\s)";

	// ------------------------------------------
	// 负向零宽断言
	// 只是想要确保某个字符没有出现,但并不想去匹配它时
	// ------------------------------------------

	/**
	 * 匹配包含后面不是字母u的字母q的单词
	 * <p>
	 * 问题:如果q出现在单词的结尾的话,像Iraq,Benq,这个表达式就会出错
	 * </p>
	 */
	public static String pat28 = "\\b\\w*q[^u]\\w*\\b";

	/**
	 * 负向零宽断言能解决这样的问题,因为它只匹配一个位置,并不消费任何字符。现在,我们可以这样来解决这个问题:。
	 */
	public static String pat28_2 = "\\b\\w*q(?!u)\\w*\\b";

	/**
	 * 零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。
	 * <p>
	 * 匹配三位数字,而且这三位数字的后面不能是数字
	 * </p>
	 */
	public static String pat29 = "\\d{3}(?!\\d)";

	/**
	 * 匹配不包含连续字符串abc的单词。
	 */
	public static String pat30 = "\\b((?!abc)\\w)+\\b";

	/**
	 * (?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp
	 * <p>
	 * 匹配前面不是小写字母的七位数字。
	 * </p>
	 */
	public static String pat31 = "(?<![a-z])\\d{7}";

	/**
	 * 匹配不包含属性的简单HTML标签内里的内容
	 * <p>
	 * 请详细分析表达式(?<=<(\w+)>).*(?=<\/\1>),这个表达式最能表现零宽断言的真正用途。
	 * </p>
	 */
	public static String pat32 = "(?<=<(\\w+)>).*(?=<\\/\\1>)";

	// ------------------------------------------
	// 注释
	// ------------------------------------------

	/**
	 * 小括号的另一种用途是通过语法(?#comment)来包含注释。
	 */
	public static String pat33 = "2[0-4]\\d(?#200-249)|25[0-5](?#250-255)|[01]?\\d\\d?(?#0-199)";

	// ------------------------------------------
	// 贪婪与懒惰
	// ------------------------------------------

	/**
	 * 当正则表达式中包含能接受重复的限定符时,
	 * 
	 * 通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符
	 * <p>
	 * 匹配最长的以a开始,以b结束的字符串。
	 * 
	 * 如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
	 * </p>
	 */
	public static String pat34 = "a.*b";

	/**
	 * 懒惰匹配,也就是匹配尽可能少的字符。
	 * 
	 * 前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。
	 * 
	 * 这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复
	 * <p>
	 * 匹配最短的,以a开始,以b结束的字符串。
	 * 
	 * 如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)
	 * 
	 * 正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权
	 * </p>
	 */
	public static String pat35 = "a.*?b";

	// ------------------------------------------
	// 平衡组/递归匹配
	// ------------------------------------------

	public static void main(String[] args) {
		new RegexDemo().test01();
	}

	/**
	 * 
	 * @Title: test01 void
	 * @throws
	 */
	public void test01() {
		boolean result = false;
		// result = Pattern.matches(pat16, "010)12345678");
		result = Pattern.matches(pat26, "1234567890");
		System.out.println(result);
	}

	public void demo() {
		Pattern p = Pattern.compile("a*b");
		Matcher m = p.matcher("aaaab");
		boolean b = m.matches();

		boolean b2 = Pattern.matches("a*b", "aaaab");

		System.out.println(b + "\t" + b2);
	}
}

 

 

平衡组/递归匹配

要求:

匹配像( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构

 

语法构造:

  • (?'group') 把捕获的内容命名为group,并压入堆栈(Stack)
  • (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  • (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  • (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

表达式:

 

<                         #最外层的左括号
    [^<>]*                #最外层的左括号后面的不是括号的内容
    (
        (
            (?'Open'<)    #碰到了左括号,在黑板上写一个"Open"
            [^<>]*       #匹配左括号后面的不是括号的内容
        )+
        (
            (?'-Open'>)   #碰到了右括号,擦掉一个"Open"
            [^<>]*        #匹配右括号后面不是括号的内容
        )+
    )*
    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败

>                         #最外层的右括号

 

 

注:为了避免(\(把你的大脑彻底搞糊涂,用尖括号代替圆括号,

问题变成:问题变成了如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?

 

平衡组的一个最常见的应用就是匹配HTML

下面这个例子可以匹配嵌套的<div>标签

<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>

 

相关截图:

===========================================================================

表1.常用的元字符

 表2.常用的限定符

 

表3.常用的反义代码

 

表4.常用分组语法

 

表5.懒惰限定符

表6.常用的处理选项

 

表7.尚未详细讨论的语法

 

 

 

 

 

-----------------------------------------------------------------------------------------------------------------

@author Free Coding http://ln-ydc.iteye.com/

 

  • 大小: 20.3 KB
  • 大小: 15.3 KB
  • 大小: 26.5 KB
  • 大小: 47.7 KB
  • 大小: 20.6 KB
  • 大小: 50.3 KB
  • 大小: 115.5 KB
分享到:
评论

相关推荐

    Java使用正则表达式提取XML节点内容的方法示例

    为了帮助开发者更好地掌握Java正则表达式技术,我们提供了一系列的Java正则表达式技巧大全,包括《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧...

    java正则表达式.zip

    - 正则表达式中的特殊字符需要转义,如`\d`应写为`\\d`。 - 如果正则表达式在字符串中,需要额外的转义,如`"\\d\\d"`。 - 贪婪与非贪婪匹配:默认情况下,`*`, `+`, `?`是贪婪的,会尽可能多地匹配。如果在后面加上...

    java使用正则表达式判断手机号的方法示例

    8. java正则表达式技巧大全:文章最后还提供了几个有关于java算法相关的内容,例如《Java正则表达式技巧大全》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java...

    Java正则表达式 Java 正则表达式

    `在正则表达式中具有特殊含义,分别代表零个或多个、一个或多个、零个或一个前一个字符。 4. **范围处理** - 使用方括号`[]`定义字符范围,例如`[a-zA-Z]`表示匹配任何字母。 5. **预定义字符类** - `\s`:匹配...

    Java根据正则表达式生成字符串—Xeger,automaton

    在Java编程语言中,处理字符串和正则表达式是一项常见的任务。正则表达式是一种强大的文本模式匹配工具,可以用于搜索、替换或者提取符合特定规则的字符串。在本篇文章中,我们将深入探讨如何利用Java中的Xeger和...

    java正则表达式匹配工具

    Java正则表达式匹配工具是IT领域中一种强大的文本处理工具,它利用正则表达式(Regular Expression)的规则来查找、替换或者提取文本中的特定模式。正则表达式是一种特殊的字符序列,能够帮助程序员或者用户高效地...

    使用Java正则表达式分析处理日志

    本篇将围绕“使用Java正则表达式分析处理日志”这一主题,探讨如何利用Java的正则表达式功能来提取、过滤和操作日志数据。 首先,我们需要理解正则表达式的基本概念。正则表达式(Regular Expression)是一种模式...

    JAVA正则表达式大全

    2. **正则表达式中的特殊字符** 特殊字符是具有特定含义的字符,例如`\`用于转义,使得原本具有特殊意义的字符如`(`、`)`、`.`等变成普通字符。其他特殊字符如`\d`代表数字,`\s`代表空白字符,`\w`代表单词字符...

    Java 使用正则表达式对象实现正则的获取功能

    在 Java 中,使用正则表达式对象可以实现各种字符串匹配和提取操作。正则表达式对象主要通过 Pattern 和 Matcher 两个类来实现。下面详细介绍如何使用正则表达式对象实现正则获取功能。 一、基本概念 在使用正则...

    java通过正则表达式匹配获取MAC(支持windows和Linux)

    java通过正则表达式匹配获取MAC(支持windows和Linux)

    java_zhengze.rar_正则表达式_正则表达式 java

    本资料"java_zhengze.rar"提供了对Java正则表达式的详细讲解,包括基本概念、元字符、预定义字符类以及各种匹配操作,对于Java开发者来说是一份非常实用的学习资源。 首先,我们来了解一下正则表达式的基石——元...

    Java正则表达式.ppt

    Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...

    java正则表达式验证IP地址

    Java正则表达式验证IP地址是指使用Java语言中的正则表达式来验证IP地址是否符合标准。IP地址是指在网络通信中用来标识设备的地址,它是一种逻辑地址,通过它可以找到网络中的设备。在Java中,可以使用正则表达式来...

    常用java正则表达式

    ### 常用Java正则表达式知识点 #### 一、引言 正则表达式是一种强大的工具,用于处理文本并查找模式。多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java...

    java Xeger 根据正则表达式生成满足的随机数据

    Java中的Xeger是一个非常有用的工具,它允许开发者根据指定的正则表达式生成随机的数据。Xeger是基于Java的org.apache.commons.text.RandomStringGenerator类和org.apache.commons.lang3.RandomStringUtils库的一个...

    java 正则表达式应用jar包 regex-smart.jar

    Java正则表达式是编程语言Java中的一个强大工具,它用于模式匹配、数据验证和文本检索替换。在Java中,正则表达式是通过java.util.regex包提供的接口和类来实现的。`regex-smart.jar`这个库显然是为了简化开发者在...

    PB实现的正则表达式

    在本话题中,我们将探讨如何使用PowerBuilder 11.5这一经典的开发环境来实现正则表达式功能。PowerBuilder是一款基于对象的快速应用程序开发工具,尤其适合于数据库应用系统的开发。 标题"PB实现的正则表达式"表明...

    详解Java判断是否是整数,小数或实数的正则表达式

    在Java中使用正则表达式来判断字符串是否符合整数、小数或实数的格式是一种常见且有效的做法。在编程中,我们经常需要对输入的字符串进行格式验证,以确保它们符合预期的数值格式,尤其是在处理财务数据、用户输入...

    常用正则表达式HTML,JAVA合集

    这个合集提供的HTML和Java正则表达式实例,为开发者提供了一个快速参考的工具,帮助他们在开发过程中快速有效地实现数据验证功能。理解并熟练运用这些正则表达式,对于提高代码质量和用户体验都有极大的帮助。在实际...

    java 使用正则表达式验证电话号码的格式

    java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式

Global site tag (gtag.js) - Google Analytics