/*以下是我最近研究正则表达式的成果希望能对大家有帮助。其中也有我碰到的不明白之处,各位有精通的请发mail给我讲讲。还有有谁对javascript的正则表达式精通请给大家发一下吧。这些东东都是Javadoc上有的,还有一些是我在java.sun.com/docs/books/tutorial/extra/regex/index.Html上看到的,我建议对正则表达式感爱好的不妨上去看看,很不错。
*/
package testreg;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <p>Title: 正则表达式的研究</p>
* <p>Description:
* 最近在工作中经常用到一些正则表达式的使用问题,到网上去找介绍大多是一鳞半爪。求人不如求已。一狠心,自己看!这两天利用我们项目两期之间的一点空闲对J2SE所支持的正则表达式来了个彻底研究!代价是……就是浪废了部门近十二张白纸。闲话少说,书归正传。
* 原理:
* 正则表达式的原理是有限状态自动机,自动机内部有有限个状态,有一个初始状态,有一个结束状态。自动机根据输入和自身内部的当前状态来决定下一步于什么。呵呵,这是很久以前学的东东了也记不清了,大家只作参照吧。
* Java中的正则表达式:
* 从J2SE1.4起Java增加了对正则表达式的支持就是java.util.regex包,这个包中主要有3个类:Pattern,代表模式,就是正则表达式自身,Matcher,是一个有限状态自动机,其实大多数的活还是让Pattern类于了,Matcher往往只是简单的调用Pattern,不知道这是什么模式。这两个类写的都很经典,还有不少算法在内值得有功力的人仔细研究一下。另一个是一个异常类当所用正则表达式不正确时抛出,是运行时异常。
* 几个难点:
* 1.line terminator
* line terminator 中文意终结符,是指一个或两个字符组成的字符序列。java中的
* 所有line terminator:
* A newline (line feed) character (' '),
* -----------换行符(0A)
* A carriage-return character followed immediately by a newline character (" "),
* -----------回车+换行(0D0A)
* A standalone carriage-return character (' '),
* -----------回车(0D)
* A next-line character ('u0085'),
* ------------下一行符?(?表示我也不知道是什么,请大家明白的给我发mail
* A line-separator character ('u2028'), or
* ------------行分隔符?
* A paragraph-separator character ('u2029).
* ------------段落分隔符?
* If UNIX_LINES mode is activated, then the only line terminators recognized are newline characters.
* 假如使用unix模式则只有被认为是line terminator,也就是在使用pattern时如下:
* Pattern p=Pattern.compile("正则表达式",Pattern.UNIX_LINE);
* 或 Pattern p=Pattern.compile("(?d)正则表达式")
* "."匹配除line terminator以外的所有字符(未指定DOTALL时)
* 在指定DOTAll模式时"."匹配所有字符
* 2.Quantifiers,Greedy,RelUCtant and Possessive.
* 这几个词不太好译,原文是Greedy Quantifiers,Reluctant Quantifiers and Possessive Quantifiers凭我这点英语我只好译作贪婪的量子,不情愿的量子和占有欲强的量子?这也太搞笑了好在我理解了他们的意思。这点等下我细说。
* 3. 对于[a-zA-Z],[a-d[h-i]],[^a-f],[b-f&&[a-z]],[b-f&&[^cd]]等形式的理解对于上述,原文用range,union,negation,intersection,suBTraction等来描述range表是范围,union是并集,negation是取反,intersection是交集,subtraction是……是减法??反正是减去一部分的意思
* range a-z 从a到z的小写字母
* negation [^a-f]除了a-f之外所有的,全集是所有字符
* union [a-d[h-i]] a-d并h-i
* subtraction [b-f&&[^cd]] 就是b-f中除了cd以外的都是
* intersection[b-f&&[a-z]] 就是b-f与a-z中的公共部分
* 我总结了一下,其实就是方括号表示一个集合,集合中的元素用列举法表示如[abcd],但太多了怎么为?总不能把从a到z的全列举吧?那就用a-z表示且省略了方括号,交集用&&表示,并集省略,差集(对subtraction译成差集还差不多)用交集和取反来表示。所以,以上的可表示为:
* [[a-z][A-Z]],[[a-d][h-i]],[^a-f],[[b-f]&&[a-z]],[[b-f]&&[^cd]]
* 这样是不是和我们的习惯相符了.
* 4.各个标志的意义
* 在生成pattern时可以同时使用几个标志来指定进行匹配时的方案。
* 用法形如:Pattern p=Pattern.compile(".*a?",Pattern.UNIX_LINES);
* 当同时指定多个标志时可以使用""操作符连接如:
* Pattern p=Pattern.compile(".*a?,Pattern.UNIX_LINESPattern.DOTALL);
* 也可以在表达式中指定如:
* Pattern p=Pattern.compile("(?d).*a?");
* Pattern p=Pattern.compile("(?d)(?s).*a?");
* 以上两个定义和前面两个对应等价
* 所有的标志如下:
* Constant Equivalent Embedded Flag EXPression
Pattern.CANON_EQ None Enables canonical equivalence
Pattern.CASE_INSENSITIVE (?i) Enables case-insensitive matching
Pattern.COMMENTS (?x) Permits whitespace and comments in pattern.
Pattern.MULTILINE (?m) Enables multiline mode.
Pattern.DOATALL (?s) Enables dotall mode
Pattern.UNICODE_CASE (?u) Enables Unicode-aware case folding.
Pattern.UNIX_LINES (?d) Enables Unix lines mode
CANON_EQ 指定使用规范等价模式?这个我理解的也有限,是不是说只要指定了这个模式则ascii码的'a'就可以和unicode的'a'还有XXX码的'a'相等?请教各位。(mail to me)
CASE_INSENSITIVE 指定使用大小写不敏感的匹配模式,这个好理解,但要注重这个标志只是对ascii码有效,要使unicode在比较时也忽略大小写要同时指定UNICODE_CASE,就是要指定CASE_INSENSITIVEUNICODE_CASE或使用(?i)(?u)
COMMENTS 指定使用注释和忽略空白,也就是".*a"==". *a #this is comments"我想这个在正则表达式很大,而且是在文件中输入时比较有用,平时我看也用不上。
MULTILINE In multiline mode the expressions ^ and $ match just after
or just before, respectively, a line terminator or the end of the
input sequence. By default these expressions only match at the beginning
and the end of the entire input sequence
指定使用多行匹配模式,在默认模式下,^和$分别只匹配一个输入的开始和结束。
在这种模式下,^和$ 除了匹配整个输入的开始和结束外还匹配一个line terminator的后边和前边(不是前边和后边,就是说^匹配line terminator的后边$匹配line terminator的前边。
DOATALL 如指定了这个模式则"."可匹配任何字符包括line terminator UNIX_LINES 指定这个模式时只有被认为是line terminator而和都不是其他的我一时想不起来了,在具体介绍时再说吧。
</p>
/
public class TestReg2
{
public static void main(String[] args)
{
String str1 = "";
Object str = "";
//注重: , ,等转义字符在java字符串常量中要写成 , ,等,否则编译都过不去
//s匹配 , , 和空格
System.out.println("s匹配 , , 和空格 "+" ".matches("s{4}"));
//S和s互逆
System.out.println("S和s互逆 "+"/".matches("S"));
//.不匹配和
System.out.println(".不匹配和 "+" ".matches("."));
System.out.println(" ".matches("."));
//w匹配字母,数字和下划线
System.out.println("w匹配字母,数字和下划线 "+"a8_".matches("www"));
//W和w互逆
System.out.println("W和w互逆 "+"&_".matches("Ww"));
//d匹配数字
System.out.println("d匹配数字 "+"8".matches("d"));
//D与d互逆
System.out.println("D与d互逆"+"%".matches("D"));
//两者都匹配但意文不同
System.out.println("======================");
System.out.println("表示00a匹配00a "+" ".matches(" "));
System.out.println("表示匹配换行 "+" ".matches(" "));
System.out.println("======================");
//两者都匹配但意文不同
System.out.println(" ".matches(" "));
System.out.println(" ".matches(" "));
System.out.println("======================");
//^匹配开头
System.out.println("^匹配开头"+"hell".matches("^hell"));
System.out.println("abc hell".matches("^hell"));
//$匹配结束
System.out.println("$匹配结束"+"my car abc".matches(".*ar$"));
System.out.println("my car".matches(".*ar$"));
分享到:
相关推荐
Java中提供了对正则表达式的支持,使得开发者可以使用正则表达式来匹配和提取字符串中的内容。 二、XML节点内容提取方法 在Java中,可以使用正则表达式来提取XML节点内容。下面是一个简单的示例: ```java public ...
在本篇文章中,我们将深入探讨如何利用Java中的Xeger和automaton库来根据正则表达式生成随机字符串。 首先,我们要了解什么是正则表达式。正则表达式,也被称为regex,是由字符、特殊符号组成的模式,用于匹配一...
在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心类。 **1. Pattern类** Pattern类是Java正则表达式的起点,它将一个正则表达式编译成一个模式对象。这个编译过程可以优化...
Java中的正则表达式主要通过`java.util.regex`包中的类来实现,如`Pattern`和`Matcher`。 在日志处理中,我们通常需要完成以下任务: 1. **过滤日志级别**:日志通常包含不同的级别,如DEBUG、INFO、WARN、ERROR等...
在Java中,正则表达式的使用主要依赖于`java.util.regex`包中的类,如`Pattern`和`Matcher`。 首先,我们来看`Pattern`类。这个类是正则表达式的模板,负责编译和存储正则表达式。一旦正则表达式被编译为`Pattern`...
3. Pattern和Matcher类的使用:在java中,Pattern类和Matcher类是用于正则表达式匹配的。Pattern类用于编译正则表达式,而Matcher类用于匹配字符串。 4. Pattern.compile()方法:Pattern.compile()方法用于编译正则...
正则表达式的学习需要对元字符、量词、预查、后向引用等概念有深入理解,同时掌握Java中`Pattern`和`Matcher`的使用方法,结合实际案例进行实践,才能灵活运用到实际项目中。在处理字符串相关问题时,熟练掌握正则...
Java正则表达式是Java语言中用于处理字符串的强大工具,它允许程序员进行复杂的字符串匹配、查找和替换操作。正则表达式(Regular Expression)是一种模式匹配语言,通过特定的语法来描述字符串的模式,用于在文本中...
java通过正则表达式匹配获取MAC(支持windows和Linux)
2. **Java中的正则表达式**: Java提供了`java.util.regex`包,通过`Pattern`和`Matcher`类支持正则表达式。以下是如何在Java中验证电话号码的一个例子: ```java import java.util.regex.Pattern; import java....
java使用正则表达式进行校验验证,主要使用了Pattern和Matcher类,直接main方法运行就可以,亲测有效
在 Java 中,使用正则表达式对象可以实现各种字符串匹配和提取操作。正则表达式对象主要通过 Pattern 和 Matcher 两个类来实现。下面详细介绍如何使用正则表达式对象实现正则获取功能。 一、基本概念 在使用正则...
正则表达式是编程语言中用于模式匹配和字符串处理的强大工具,在Java中也不例外。Java的正则表达式功能强大,可以用于验证输入、提取信息、替换文本等多种场景。本资料"java_zhengze.rar"提供了对Java正则表达式的...
在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式的起源可以追溯到20世纪中叶,由Warren McCulloch和Walter Pitts的神经网络理论,以及...
Java中的Xeger是一个非常有用的工具,它允许开发者根据指定的正则表达式生成随机的数据。Xeger是基于Java的org.apache.commons.text.RandomStringGenerator类和org.apache.commons.lang3.RandomStringUtils库的一个...
在Java中,通过`java.util.regex`包提供了对正则表达式的支持。 ### 2. 邮箱地址验证 在实际应用中,经常需要验证用户输入的邮箱地址是否有效。文件中的方法`checkEmail`实现了这一功能,其正则表达式为: ```java...
在Java中,可以使用正则表达式来验证IP地址是否正确。 正则表达式的作用是将字符串分割成多个小组,并通过这些小组来匹配指定的模式。在Java中,我们可以使用java.util.regex包来使用正则表达式。在这个包中,有两...
java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式
本资源文件是我自己总结的,其中包括5个类,这5个类的代码基本概括了java正则表达式替换String的多种情况,比如获取某个文件路径中盘符/后边的部分内容,提取"<title>XXXX</title>"中的文字XXXX,用正则表达式获取指定...
本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码。 1. **字符串基础** - Java中的字符串是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。这由`final`关键字确保,提高了...