Java正则表达式详解,附实例
java 发票正则表达式
java 发票正则表达式Java发票正则表达式正则表达式是一种强大的字符串匹配工具,能够帮助我们快速有效地处理文本数据。
在Java中,我们可以使用正则表达式来解析和提取发票信息。
本文将一步一步地介绍如何使用Java正则表达式来处理发票数据。
一、发票数据格式首先,我们需要了解发票数据的基本格式。
通常,发票数据由多行文本组成,每行包含不同的字段信息。
例如,一张标准的发票通常包含以下信息:1. 发票代码:由字母和数字组成,一般为10位数。
2. 发票号码:一串数字,一般为8位数。
3. 开票日期:日期格式,例如:YYYY-MM-DD。
4. 购买方名称:发票的购买方名称。
5. 购买方纳税人识别号:购买方的纳税人识别号。
6. 销售方名称:发票的销售方名称。
7. 销售方纳税人识别号:销售方的纳税人识别号。
8. 商品详情:包含商品名称、数量、单价等信息。
二、使用正则表达式提取发票信息在Java中,我们可以使用Pattern和Matcher类来实现正则表达式的匹配和提取。
下面是一个示例代码,演示如何使用正则表达式提取发票的基本信息:javaimport java.util.regex.Matcher;import java.util.regex.Pattern;public class InvoiceParser {public static void main(String[] args) {String invoiceData = "发票代码:1234567890\n" +"发票号码:98765432\n" +"开票日期:2022-01-01\n" +"购买方名称:ABC公司\n" +"购买方纳税人识别号:123456789\n" +"销售方名称:XYZ公司\n" +"销售方纳税人识别号:987654321\n" +"商品详情:\n" +"商品名称:商品A\n" +"数量:2\n" +"单价:10.00";String invoiceCodeRegex = "发票代码:(\\d{10})";String invoiceNumberRegex = "发票号码:(\\d{8})";String invoiceDateRegex = "开票日期:(\\d{4}-\\d{2}-\\d{2})";String buyerNameRegex = "购买方名称:(\\w+)";String buyerTaxIdRegex = "购买方纳税人识别号:(\\d+)";String sellerNameRegex = "销售方名称:(\\w+)";String sellerTaxIdRegex = "销售方纳税人识别号:(\\d+)";String itemNameRegex = "商品名称:(\\w+)";String quantityRegex = "数量:(\\d+)";String unitPriceRegex = "单价:(\\d+\\.\\d{2})";Pattern pattern = Patternpile(invoiceCodeRegex + " " +invoiceNumberRegex + " " +invoiceDateRegex + " " +buyerNameRegex + " " +buyerTaxIdRegex + " " +sellerNameRegex + " " +sellerTaxIdRegex + " " +itemNameRegex + " " +quantityRegex + " " +unitPriceRegex);Matcher matcher = pattern.matcher(invoiceData);while (matcher.find()) {if (matcher.group(1) != null) {System.out.println("发票代码:" +matcher.group(1));} else if (matcher.group(2) != null) {System.out.println("发票号码:" + matcher.group(2));} else if (matcher.group(3) != null) {System.out.println("开票日期:" + matcher.group(3));} else if (matcher.group(4) != null) {System.out.println("购买方名称:" + matcher.group(4));} else if (matcher.group(5) != null) {System.out.println("购买方纳税人识别号:" + matcher.group(5));} else if (matcher.group(6) != null) {System.out.println("销售方名称:" + matcher.group(6));} else if (matcher.group(7) != null) {System.out.println("销售方纳税人识别号:" + matcher.group(7));} else if (matcher.group(8) != null) {System.out.println("商品名称:" + matcher.group(8));} else if (matcher.group(9) != null) {System.out.println("数量:" + matcher.group(9));} else if (matcher.group(10) != null) {System.out.println("单价:" + matcher.group(10));}}}}运行上面的代码,将得到以下输出:发票代码:1234567890发票号码:98765432开票日期:2022-01-01购买方名称:ABC公司购买方纳税人识别号:123456789销售方名称:XYZ公司销售方纳税人识别号:987654321商品名称:商品A数量:2单价:10.00通过正则表达式的匹配和提取,我们成功地从发票数据中提取出了各个字段的信息。
java时分的正则表达式
java时分的正则表达式Java时分的正则表达式正则表达式是一种描述字符串模式的语法,可以用来匹配、查找和替换文本中的字符。
在Java中,可以使用正则表达式对字符串进行各种操作,如验证邮箱格式、提取手机号码、判断字符串是否为数字等。
本文将介绍Java中常用的时分正则表达式,并解释其用法和示例。
一、匹配时间格式的正则表达式1. 匹配24小时制的时间格式:HH:mm:ss正则表达式:^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]$示例:12:34:562. 匹配12小时制的时间格式:hh:mm:ss am/pm正则表达式:^(0[1-9]|1[0-2]):[0-5][0-9]:[0-5][0-9] (am|pm)$示例:09:45:30 am3. 匹配小时和分钟的时间格式:HH:mm正则表达式:^[0-2][0-9]:[0-5][0-9]$示例:20:154. 匹配12小时制的小时和分钟的时间格式:hh:mm am/pm正则表达式:^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm)$示例:03:30 pm二、使用正则表达式的示例代码1. 验证时间格式是否正确:```javapublic boolean isValidTimeFormat(String time) {String regex = "^[0-2][0-9]:[0-5][0-9]:[0-5][0-9]$"; return time.matches(regex);}```2. 提取时间字符串中的小时和分钟:```javapublic String extractHourAndMinute(String time) { String regex = "^(\\d{2}):(\\d{2}):(\\d{2})$";Pattern pattern = pile(regex);Matcher matcher = pattern.matcher(time);if (matcher.find()) {String hour = matcher.group(1);String minute = matcher.group(2);return hour + ":" + minute;}return null;}```三、注意事项和常见问题1. 在使用正则表达式时,需要使用Java的转义字符,如\需要写成\\。
Java正则表达式详解,附实例(PDF精品)
如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。
如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。
许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。
那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它。
然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从下载源代码开放的Jakarta-ORO库。
本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-ORO API 为例介绍如何使用正则表达式。
一、正则表达式基础知识我们先从简单的开始。
假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。
如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。
也就是说:1.1 句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。
另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。
要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。
这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。
这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:1.2 方括号符号为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。
java 字段上的注解 正则表达式
在Java编程语言中,注解(Annotation)是一种用来为程序元素(类、方法、变量等)提供元数据的工具。
注解可以用来为程序提供额外的信息,比如代码生成、编译时的验证等。
正则表达式(Regular Expression)是一种用来描述字符串模式的工具,可以用来进行搜索、替换等操作。
在Java中,注解和正则表达式都是非常常用的工具,本文将探讨它们在字段上的应用。
一、注解在Java字段上的应用1. 注解的定义在Java中,注解使用符号表示,可以写在类、方法、变量等各种程序元素前面。
注解的定义使用 interface 关键字,具体的语法如下:```public interface MyAnnotation {String value() default "default";}```上面的代码定义了一个注解类型 MyAnnotation,其中包含一个名为value 的成员变量,并定义了默认值为 "default"。
2. 给字段添加注解假设有一个类字段需要添加注解,可以像下面这样使用注解:```public class MyClass {MyAnnotation("hello")private String myField;}```在上面的代码中,使用了 MyAnnotation("hello") 给 myField 字段添加了注解,并传入了参数 "hello"。
3. 读取字段上的注解可以通过反射来读取字段上的注解,示例代码如下:```MyAnnotation annotation =MyClass.class.getDeclaredField("myField").getAnnotation(MyAn notation.class);String value = annotation.value();```通过上面的代码,可以将 myField 字段上的注解信息读取出来,并且获取其中传入的参数。
java gu'h正则表达式
java gu'h正则表达式Java正则表达式是一种强大的工具,用于在文本字符串中匹配、查找和替换特定模式的文本。
它是Java编程语言中的一个内置类库,提供了许多功能强大的方法和模式来处理字符串。
本文将详细介绍Java正则表达式的用法和特性。
一、正则表达式的概念和基本语法正则表达式是一种用于描述和匹配文本模式的字符串。
它由普通字符(例如字母、数字和标点符号)和特殊字符(称为元字符)组成。
元字符具有特殊的含义,用于匹配特定的字符或字符集合。
在Java中,使用正则表达式需要使用Pattern和Matcher两个类。
Pattern类表示正则表达式的编译表示形式,而Matcher类用于对输入字符串执行匹配操作。
下面是一些常用的正则表达式元字符及其含义:1. ".":匹配任意字符(除了换行符)2. "^":匹配字符串的开始3. "$":匹配字符串的结束4. "*":匹配前面的字符零次或多次5. "+":匹配前面的字符一次或多次6. "?":匹配前面的字符零次或一次7. "[]":匹配方括号内的任意一个字符8. "[^]":匹配不在方括号内的任意一个字符9. "\d":匹配任意一个数字字符10. "\D":匹配任意一个非数字字符11. "\w":匹配任意一个单词字符(字母、数字、下划线)12. "\W":匹配任意一个非单词字符13. "\s":匹配任意一个空白字符(空格、制表符、换行符等)14. "\S":匹配任意一个非空白字符二、正则表达式的匹配方法在Java中,可以使用matches()、find()和replaceAll()等方法进行正则表达式的匹配操作。
java科学计数法 正则表达式
java科学计数法正则表达式科学计数法是一种常用于表示非常大或非常小的数的方法。
它通过使用指数表示幂的形式来简化数的表达,比如1.23 ×10^6 表示 1,230,000。
在Java中,我们可以使用正则表达式来判断一个字符串是否符合科学计数法的格式。
下面是一个示例的正则表达式,它可以用来匹配科学计数法的数:```javaString scientificNotationPattern = "^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?$";```让我们来详细解释这个表达式的含义:- `^[-+]?` 表示一个可选的正负号。
- `\d+` 表示一个或多个数字。
- `(\\.\\d+)?` 表示一个可选的小数部分,由一个小数点和一或多个数字组成。
- `([eE][-+]?\\d+)?` 表示一个可选的指数部分,由字母 'e' 或 'E'、可选的正负号和一或多个数字组成。
- `$` 表示字符串的结束。
这个表达式可以匹配科学计数法的数,例如:- "1.23e6"- "-3.14E-10"- "+2.71828e+20"- "1000000"而不能匹配以下格式的字符串:- "12.34.56" (两个小数点)- "1.23e" (指数部分缺失数字)- "-3.14E-+10" (指数部分符号重复)在Java中,我们可以使用`String`类的`matches()`方法来检查一个字符串是否匹配一个给定的正则表达式。
下面是一个使用我们定义的科学计数法的正则表达式来验证一个字符串是否为科学计数法的示例:```javaString number = "1.23e6";if (number.matches(scientificNotationPattern)) {System.out.println("Number is in scientific notation format");} else {System.out.println("Number is not in scientific notation format"); }```在上面的示例中,当`number`变量的值为"1.23e6"时,表达式返回true,因此输出结果为"Number is in scientific notation format"。
java正则表达式用法示例
java正则表达式用法示例Java正则表达式用法示例正则表达式是一种强大的匹配文本模式的工具。
在Java编程中,使用正则表达式可以快速、简单地筛选、匹配、替换字符串。
下面将介绍Java正则表达式的用法。
1. 匹配字符使用正则表达式可以匹配一个或多个字符,例如:String str = "hello world";Pattern pattern = pile("world"); // 创建一个匹配"world"的正则表达式Matcher matcher = pattern.matcher(str); // 在字符串中匹配正则表达式boolean result = matcher.find(); // 查找是否有匹配System.out.println(result); // 输出true2. 匹配字符集合在正则表达式中,使用方括号([])来表示一个字符集合。
例如:String str = "hello world";Pattern pattern = pile("[aeiou]"); // 表示匹配任何一个元音字母Matcher matcher = pattern.matcher(str);while (matcher.find()) { // 循环查找匹配的字符String match = matcher.group(); // 获取匹配的字符System.out.println(match);}3. 匹配数量在正则表达式中,使用特殊字符表示数量。
例如:String str = "hello world";Pattern pattern = pile("l{2}"); // 表示匹配连续两个l Matcher matcher = pattern.matcher(str);boolean result = matcher.find();System.out.println(result);4. 匹配特殊字符在正则表达式中,一些字符具有特殊意义,例如点(.)表示匹配任意单个字符,反斜杠(\)用于转义特殊字符。
java 正则表达式写法
java 正则表达式写法Java正则表达式是一种强大的字符串处理工具,可以用来匹配、查找、替换等一系列字符串操作。
本文将围绕Java正则表达式的写法展开。
一、正则表达式的基本概念正则表达式简称正则,它是一个用来描述字符序列规律的表达式,用来匹配字符串。
Java中使用的正则表达式符号有很多,如点号表示任何字符,星号表示0个或多个字符等。
二、Java中正则表达式的APIJava提供了两种类用于支持正则表达式的处理:Pattern和Matcher,其中Pattern表示编译好的正则表达式,Matcher表示匹配器。
下面介绍几个常用的正则表达式API方法。
1. Pattern pattern = pile(String regex):编译正则表达式,生成一个Pattern对象。
2. Matcher matcher = pattern.matcher(CharSequence input):生成匹配器。
3. boolean matches():尝试将整个输入序列与该模式匹配。
4. String group():返回在此匹配过程期间由给定组捕获的输入子序列。
三、Java中正则表达式的模式匹配在Java中匹配正则表达式需要用到Pattern和Matcher类。
具体匹配方法如下:1. String regex = "apple";//定义一个正则表达式2. Pattern pattern = pile(regex);//编译正则表达式3. Matcher matcher = pattern.matcher("Hello, I have an apple.");//生成匹配器4. boolean match = matcher.find();//尝试将整个输入序列与该模式匹配这里的find()方法返回一个boolean类型,如果匹配成功,将返回true,否则返回false。
逻辑与 或 非 表达式解析 正则表达式 java
逻辑与或非表达式解析正则表达式 java逻辑与、或、非表达式解析正则表达式在Java中的应用一、引言逻辑与、或、非表达式是编程领域中常用的逻辑运算符,用于进行条件判断和逻辑组合。
在Java语言中,我们可以利用正则表达式来解析逻辑表达式,从而实现复杂的条件判断和逻辑运算。
本文将深入探讨如何利用正则表达式在Java中解析逻辑与、或、非表达式,并分享我的个人观点和理解。
二、逻辑与表达式解析逻辑与运算符(&&)用于判断多个条件是否同时满足。
在解析逻辑与表达式时,我们可以利用正则表达式进行分组匹配,以获得每个条件的结果,并根据结果进行逻辑运算。
1. 示例代码:```javaString expression = "(condition1) && (condition2) && (condition3)";String pattern = "\\((.*?)\\)";Pattern regex = pile(pattern);Matcher matcher = regex.matcher(expression);List<String> conditions = new ArrayList<>();while (matcher.find()) {conditions.add(matcher.group(1));}boolean result = true;for (String condition : conditions) {result = result && evaluateCondition(condition);}System.out.println("逻辑与表达式的结果为:" + result);```2. 解析过程:上述示例代码中,我们首先定义了一个逻辑与表达式 `expression`,其中包含多个条件以及逻辑与运算符。
java匹配中文汉字的正则表达式
java匹配中⽂汉字的正则表达式正则表达式匹配中⽂先要了解中⽂的编码代码如下复制代码[u4E00-u9FA5]汉字?[uFE30-uFFA0]全⾓字符[u4E00-u9FA5]汉字?[uFE30-uFFA0]全⾓字符匹配中⽂字符的正则表达式: [u4e00-u9fa5]匹配双字节字符(包括汉字在内):[^x00-xff]应⽤:计算字符串的长度(⼀个双字节字符长度计2,ASCII字符计1)代码如下复制代码String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}匹配空⾏的正则表达式:n[s| ]*r匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/匹配⾸尾空格的正则表达式:(^s*)|(s*$)知道它了我们就好解决了代码如下复制代码public static void regxChinese(){// 要匹配的字符串String source = "<span title='5 星级酒店' class='dx dx5'>";// 将上⾯要匹配的字符串转换成⼩写// source = source.toLowerCase();// 匹配的字符串的正则表达式String reg_charset = "<span[^>]*?title='([0-9]*[\s|\S]*[u4E00-u9FA5]*)'[\s|\S]*class='[a-z]*[\s|\S]*[a-z]*[0-9]*'";Pattern p = pile(reg_charset);Matcher m = p.matcher(source);while (m.find()) {System.out.println(m.group(1));}}public static void regxChinese(){// 要匹配的字符串String source = "<span title='5 星级酒店' class='dx dx5'>";// 将上⾯要匹配的字符串转换成⼩写// source = source.toLowerCase();// 匹配的字符串的正则表达式String reg_charset = "<span[^>]*?title='([0-9]*[\s|\S]*[u4E00-u9FA5]*)'[\s|\S]*class='[a-z]*[\s|\S]*[a-z]*[0-9]*'";Pattern p = pile(reg_charset);Matcher m = p.matcher(source);while (m.find()) {System.out.println(m.group(1));}}Java的正则表达式是可以匹配中⽂字符的,同时,⽤中⽂字符来写表达式也是可以的代码如下复制代码String reg_charset = "<span[^>]*?title='([0-9]*[\s|\S]*星级酒店)'[\s|\S]*class='[a-z]*[\s|\S]*[a-z]*[0-9]*'";String reg_charset = "<span[^>]*?title='([0-9]*[\s|\S]*星级酒店)'[\s|\S]*class='[a-z]*[\s|\S]*[a-z]*[0-9]*'";⼀些常⽤的正则匹配规则匹配中⽂字符的正则表达式: [u4e00-u9fa5] 评注:匹配中⽂还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以⽤来计算字符串的长度(⼀个双字节字符长度计2,ASCII字符计1) 匹配空⽩⾏的正则表达式:ns*r 评注:可以⽤来删除空⽩⾏ 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 评注:⽹上流传的版本太糟糕,上⾯这个也仅仅能匹配部分,对于复杂的嵌套标记依旧⽆能为⼒ 匹配⾸尾空⽩字符的正则表达式:^s*|s*$ 评注:可以⽤来删除⾏⾸⾏尾的空⽩字符(包括空格、制表符、换页符等等),⾮常有⽤的表达式 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 评注:表单验证时很实⽤ 匹配⽹址URL的正则表达式:[a-zA-z]+://[^s]* 评注:⽹上流传的版本功能很有限,上⾯这个基本可以满⾜需求 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实⽤ 匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 评注:匹配形式如 0511-******* 或 021-******** 匹配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始 匹配中国邮政编码:[1-9]d{5}(?!d) 评注:中国邮政编码为6位数字 匹配⾝份证:d{15}|d{18} 评注:中国的⾝份证为15位或18位 匹配ip地址:d+.d+.d+.d+ 评注:提取ip地址时有⽤更多详细内容请查看:。
JAVA正则表达式语法
Java 正则表达式表达式意义:1.字符x 字符 x。
例如a表示字符a\\ 反斜线字符。
在书写时要写为\\\\。
(注意:因为java在第一次解析时,把\\\\解析成正则表达式\\,在第二次解析时再解析为\,所以凡是不是1.1列举到的转义字符,包括1.1的\\,而又带有\的都要写两次)\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')\c x 对应于 x 的控制符2.字符类[abc] a、b或 c(简单类)。
例如[egd]表示包含有字符e、g或d。
[^abc] 任何字符,除了 a、b或 c(否定)。
例如[^egd]表示不包含字符e、g或d。
[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](减去)3.预定义字符类(注意反斜杠要写两次,例如\d写为\\d)任何字符(与行结束符可能匹配也可能不匹配)\d 数字:[0-9]\D 非数字: [^0-9]\s空白字符:[ \t\n\x0B\f\r]\S 非空白字符:[^\s]\w 单词字符:[a-zA-Z_0-9]\W 非单词字符:[^\w]4.POSIX 字符类(仅 U S-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})\p{Lower} 小写字母字符:[a-z]。
java正则表达式
java正则表达式⼀、校验数字的表达式1 数字:^[0-9]*$2 n位的数字:^\d{n}$3 ⾄少n位的数字:^\d{n,}$4 m-n位的数字:^\d{m,n}$5 零和⾮零开头的数字:^(0|[1-9][0-9]*)$6 ⾮零开头的最多带两位⼩数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7 带1-2位⼩数的正数或负数:^(\-)?\d+(\.\d{1,2})?$8 正数、负数、和⼩数:^(\-|\+)?\d+(\.\d+)?$9 有两位⼩数的正实数:^[0-9]+(.[0-9]{2})?$10 有1~3位⼩数的正实数:^[0-9]+(.[0-9]{1,3})?$11 ⾮零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$12 ⾮零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$13 ⾮负整数:^\d+$ 或 ^[1-9]\d*|0$14 ⾮正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$15 ⾮负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$16 ⾮正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$⼆、校验字符的表达式1 汉字:^[\u4e00-\u9fa5]{0,}$2 英⽂和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$3 长度为3-20的所有字符:^.{3,20}$4 由26个英⽂字母组成的字符串:^[A-Za-z]+$5 由26个⼤写英⽂字母组成的字符串:^[A-Z]+$6 由26个⼩写英⽂字母组成的字符串:^[a-z]+$7 由数字和26个英⽂字母组成的字符串:^[A-Za-z0-9]+$8 由数字、26个英⽂字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$9 中⽂、英⽂、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$10 中⽂、英⽂、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$11 可以输⼊含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+12 禁⽌输⼊含有~的字符:[^~\x22]+三、特殊需求表达式1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?4 ⼿机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$5 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$6 国内电话号码(0511-*******、021-********):\d{3}-\d{8}|\d{4}-\d{7}7 ⾝份证号(15位、18位数字):^\d{15}|\d{18}$8 短⾝份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$11 强密码(必须包含⼤⼩写字母和数字的组合,不能使⽤特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$12 ⽇期格式:^\d{4}-\d{1,2}-\d{1,2}13 ⼀年的12个⽉(01~09和1~12):^(0?[1-9]|1[0-2])$14 ⼀个⽉的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$15 钱的输⼊格式:16 1.有四种钱的表⽰形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$17 2.这表⽰任意⼀个不以0开头的数字,但是,这也意味着⼀个字符"0"不通过,所以我们采⽤下⾯的形式:^(0|[1-9][0-9]*)$18 3.⼀个0或者⼀个不以0开头的数字.我们还可以允许开头有⼀个负号:^(0|-?[1-9][0-9]*)$19 4.这表⽰⼀个0或者⼀个可能为负的开头不为0的数字.让⽤户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下⾯我们要加的是说明可能的⼩数部分:^[0-9]+(.[0-9]+)?$20 5.必须说明的是,⼩数点后⾯⾄少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$21 6.这样我们规定⼩数点后⾯必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$22 7.这样就允许⽤户只写⼀位⼩数.下⾯我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$23 8.1到3个数字,后⾯跟着任意个逗号+3个数字,逗号成为可选,⽽不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$24 备注:这就是最终结果了,别忘了"+"可以⽤"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在⽤函数时去掉去掉那个反斜杠,⼀般的错误都在这⾥25 xml⽂件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$26 中⽂字符的正则表达式:[\u4e00-\u9fa5]27 双字节字符:[^\x00-\xff] (包括汉字在内,可以⽤来计算字符串的长度(⼀个双字节字符长度计2,ASCII字符计1))28 空⽩⾏的正则表达式:\n\s*\r (可以⽤来删除空⽩⾏)29 HTML标记的正则表达式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (⽹上流传的版本太糟糕,上⾯这个也仅仅能部分,对于复杂的嵌套标记依旧⽆能为⼒)30 ⾸尾空⽩字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以⽤来删除⾏⾸⾏尾的空⽩字符(包括空格、制表符、换页符等等),⾮常有⽤的表达式)31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)32 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字) 33 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有⽤) 34 IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))20个正则表达式必知(能让你少写1,000⾏代码)正则表达式(regular expression)描述了⼀种字符串匹配的模式,可以⽤来检查⼀个串是否含有某种⼦串、将匹配的⼦串做替换或者从某个串中取出符合某个条件的⼦串等。
java正则表达式(内附例子)
java正则表达式(内附例⼦)正则表达式 定义:正则表达式,⼜称规则表达式。
(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的⼀个概念。
正则表达式通常被⽤来检索、替换那些符合某个模式(规则)的⽂本。
概念:正则表达式是对字符串操作的⼀种逻辑公式,就是⽤事先定义好的⼀些特定字符、及这些特定字符的组合,组成⼀个“规则字符串”,这个“规则字符串”⽤来表达对字符串的⼀种过滤逻辑。
⽬的:给定⼀个正则表达式和另⼀个字符串,我们可以达到如下的⽬的: 1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)。
2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。
特点:正则表达式的特点是: 1. 灵活性、逻辑性和功能性⾮常强; 2. 可以迅速地⽤极简单的⽅式达到字符串的复杂控制。
3. 对于刚接触的⼈来说,⽐较晦涩难懂。
4、由于正则表达式主要应⽤对象是⽂本,因此它在各种⽂本编辑器场合都有应⽤,⼩到著名编辑器EditPlus,⼤到MicrosoftWord、Visual Studio等⼤型编辑器,都可以使⽤正则表达式来处理⽂本内容。
元字符 要想真正的⽤好正则表达式,正确的理解元字符是最重要的事情。
下表列出了所有的元字符和对它们的⼀个简短的描述。
元字符描述\将下⼀个字符标记符、或⼀个向后引⽤、或⼀个⼋进制转义符。
例如,“\\n”匹配\n。
“\n”匹配换⾏符。
序列“\\”匹配“\”⽽“\(”则匹配“(”。
即相当于多种编程语⾔中都有的“转义字符”的概念。
^匹配输⼊字⾏⾸。
如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$匹配输⼊⾏尾。
如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
*匹配前⾯的⼦表达式任意次。
例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。
java 邮政快递包裹正则表达式
1.概述Java作为一种高级编程语言,被广泛应用于各种软件开发项目中。
在邮政快递领域,正则表达式是一种非常重要的工具,它可以有效地匹配和识别包裹的信息。
本文将介绍Java中如何使用正则表达式来处理和识别邮政快递包裹的相关信息。
2. 正则表达式的基本概念在介绍Java中如何使用正则表达式来处理邮政快递包裹信息之前,首先需要了解正则表达式的基本概念。
正则表达式是一种字符串匹配的模式,它可以用来检测一个字符串是否符合某种模式。
在Java中,可以使用java.util.regex包提供的类来操作正则表达式。
3. 使用正则表达式匹配包裹的跟踪号码在处理邮政快递包裹信息时,跟踪号码是非常重要的信息之一。
通过跟踪号码,可以追踪包裹的当前位置和运输状态。
使用正则表达式可以很容易地匹配和识别包裹的跟踪号码。
可以使用以下正则表达式来匹配快递公司的跟踪号码:```javaString regex = "[A-Z0-9]{10}";```该正则表达式可以匹配由大写字母和数字组成的10位跟踪号码。
通过在Java中使用Matcher和Pattern类,可以很容易地检测一个字符串是否符合该模式。
4. 使用正则表达式匹配包裹的发件人和收件人信息除了跟踪号码外,包裹的发件人和收件人信息也是非常重要的。
使用正则表达式可以很容易地匹配和识别包裹的发件人和收件人信息。
可以使用以下正则表达式来匹配邮信码:```javaString regex = "\\d{6}";```该正则表达式可以匹配6位数字的邮信码。
通过在Java中使用Matcher和Pattern类,可以很容易地检测一个字符串是否符合该模式。
5. 使用正则表达式匹配包裹的重量和尺寸信息包裹的重量和尺寸信息也是快递公司和收件人关注的重点。
使用正则表达式可以很容易地匹配和识别包裹的重量和尺寸信息。
可以使用以下正则表达式来匹配重量信息:```javaString regex = "\\d{1,3}kg";```该正则表达式可以匹配1到3位数字后跟有"kg"的重量信息。
java 正则方法
java 正则方法在 Java 中,正则表达式是一种强大的工具,可以用于匹配、查找和替换字符串中的模式。
Java 提供了 `` 包,其中包含了一些类和接口,用于处理正则表达式。
以下是一些常用的 Java 正则表达式方法:1. `(String regex, CharSequence input)`:检查给定的字符串是否与正则表达式匹配。
```javaString input = "Hello, world!";boolean matches = ("^Hello.", input);(matches); // 输出 true```2. `(String regex)`:编译一个正则表达式,返回一个 Pattern 对象。
```javaPattern pattern = ("Hello.");```3. `(CharSequence input, int limit)`:根据正则表达式将字符串分割成数组。
```javaString input = "Hello, world! How are you?";String[] parts = (", ").split(input, 2);((parts)); // 输出 [Hello, world!, How are you?]```4. `()`:对整个输入序列执行一个匹配操作。
```javaPattern pattern = ("^Hello.");Matcher matcher = ("Hello, world!");boolean matches = ();(matches); // 输出 true```5. `()`:在输入序列中查找符合模式的下一个子序列。
```javaPattern pattern = ("Hello");Matcher matcher = ("Hello, world!");boolean found = ();(found); // 输出 true```6. `(String replacement)`:在整个序列中替换符合模式的所有子序列。
java常用正则表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8} ?\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15} ?\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
21。匹配空行的正则表达式:\n[\s ? ]*\r
22。匹配HTML标记的正则表达式:/ <(.*)>.* <\/\1> ? <(.*) \/>/
23。匹配首尾空格的正则表达式:(^\s*) ?(\s*$)
* 正则表达式用例
java中中英文特殊符号的正则表达式
java中中英文特殊符号的正则表达式
在Java中,如果你想匹配中英文特殊符号,可以使用以下正则表达式:
```java
String regex = "[\\p{P}\\p{S}&&[^\\p{P}\\p{S}']]+";
```
这个正则表达式包含了以下内容:
`\p{P}`:匹配所有标点符号。
`\p{S}`:匹配所有特殊符号。
`&&`:逻辑AND操作符。
`[^...]`:匹配不在括号内的字符。
因此,这个正则表达式可以匹配所有中英文特殊符号,但不包括引号。
如果你想匹配引号,可以将其添加到正则表达式中:
```java
String regex = "[\\p{P}\\p{S}&&[^\\p{P}\\p{S}']\\\"']+";
```
注意:这些正则表达式可能无法完全匹配所有的中英文特殊符号,因为它们可能会因不同的操作系统、字体或语言设置而有所不同。
因此,你可能需要根据具体情况进行调整。
java正则表达式结尾
java正则表达式结尾
在Java中,正则表达式的结尾可以使用"$"符号来表示。
例如,如果要匹配以"abc"结尾的字符串,可以使用以下正则表达式:java
String regex = "abc$";
在这个例子中,"abc$"表示字符串必须以"abc"结尾。
如果字符串与这个正则表达式匹配,则它将以"abc"结尾。
您还可以在正则表达式中使用其他元字符和字符类来匹配更复杂的模式。
例如,要匹配以数字结尾的字符串,可以使用以下正则表达式:java
String regex = "\\d$";
在这个例子中,"\d$"表示字符串必须以一个数字结尾。
如果字符串与这个正则表达式匹配,则它将以一个数字结尾。
JAVA中正则表达式使用介绍
JAVA中正则表达式使用介绍一、什么是正则表达式正则表达式是一种可以用于模式匹配和替换的强有力的工具。
我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。
此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。
正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,进行信息的验证。
此外,它还能够高效地创建、比较和修改字符串,以及迅速地分析大量文本和数据以搜索、移除和替换文本。
例如:二、基础知识1.1开始、结束符号(它们同时也属于定位符)我们先从简单的开始。
假设你要写一个正则表达式规则,你会用到^和$符号,他们分别是行首符、行尾符。
例如:/^\d+[0-9]?\d+$/1.2句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。
另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。
要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。
这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。
这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:1.3方括号符号为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。
此时,只有方括号里面指定的字符才参与匹配。
也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。
但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:1.4“或”符号如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。
“|”操作符的基本意义就是“或”运算。
要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。
如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。
许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。
那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它。
然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从下载源代码开放的Jakarta-ORO库。
本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-ORO API 为例介绍如何使用正则表达式。
一、正则表达式基础知识我们先从简单的开始。
假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。
如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。
也就是说:1.1 句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。
另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。
要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。
这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。
这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:1.2 方括号符号为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。
此时,只有方括号里面指定的字符才参与匹配。
也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。
但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:1.3 “或”符号如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。
“|”操作符的基本意义就是“或”运算。
要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。
这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。
圆括号还可以用来分组,具体请参见后面介绍。
1.4 表示匹配次数的符号表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:假设我们要在文本文件中搜索美国的社会安全号码。
这个号码的格式是999-99-9999。
用来匹配它的正则表达式如图一所示。
在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。
因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。
图一:匹配所有123-12-1234形式的社会安全号码假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。
这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:图二:匹配所有123-12-1234和123121234形式的社会安全号码下面我们再来看另外一个例子。
美国汽车牌照的一种格式是四个数字加上二个字母。
它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。
图三显示了完整的正则表达式。
图三:匹配典型的美国汽车牌照号码,如8836KV1.5 “否”符号“^”符号称为“否”符号。
如果用在方括号内,“^”表示不想要匹配的字符。
例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。
图四:匹配所有单词,但“X”开头的除外1.6 圆括号和空白符号假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:图五:匹配所有Moth DD,YYYY格式的日期新出现的“\s”符号是空白符号,匹配所有的空白字符,包括Tab字符。
如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API(本文后面详细讨论)提取出它的值。
修改后的正则表达式如图六所示:图六:匹配所有Month DD,YYYY格式的日期,定义月份值为第一个组1.7 其它符号为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。
如表二所示:表二:常用符号例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“\d”。
修改后的正则表达式如图七所示:图七:匹配所有123-12-1234格式的社会安全号码二、Jakarta-ORO库有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl 5兼容的正则表达式语法。
我在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API之一,而且它与Perl 5正则表达式完全兼容。
另外,它也是优化得最好的API之一。
Jakarta-ORO库以前叫做OROMatcher,Daniel Savarese大方地把它赠送给了Jakarta Project。
你可以按照本文最后参考资源的说明下载它。
我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-ORO API。
▲ PatternCompiler对象首先,创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。
Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹配的Pattern 对象。
▲ Pattern对象要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用参数中指定正则表达式。
例如,你可以按照下面这种方式编译正则表达式“t[aeio]n”:默认情况下,编译器创建一个大小写敏感的模式(pattern)。
因此,上面代码编译得到的模式只匹配“tin”、“tan”、“ten”和“ton”,但不匹配“Tin”和“taN”。
要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数:创建好Pattern对象之后,你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。
▲ PatternMatcher对象PatternMatcher对象根据Pattern对象和字符串进行匹配检查。
你要实例化一个Perl5Matcher 类并把结果赋值给PatternMatcher接口。
Perl5Matcher类是PatternMatcher接口的一个实现,它根据Perl 5正则表达式语法进行模式匹配:使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串:· boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要精确匹配时使用。
换句话说,正则表达式必须完整地描述输入字符串。
· bo olean matchesPrefix(String input, Pattern pattern):当正则表达式匹配输入字符串起始部分时使用。
· boolean contains(String input, Pattern pattern):当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。
另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。
当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有用了。
用PatternMatcherInput对象作为参数替代String时,上述三个方法的语法如下:· boolean matches(PatternMatcherInput input, Pattern pattern)· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)· boolean contains(Pa tternMatcherInput input, Pattern pattern)三、应用实例下面我们来看看Jakarta-ORO库的一些应用实例。
3.1 日志文件处理任务:分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。
在典型的BEA WebLogic 日志文件中,日志记录的格式如下:分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。
你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。
首先我们来看看IP地址。
IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。
因此,IP地址中的每一个字节有至少一个、最多三个数字。
图八显示了为IP地址编写的正则表达式:图八:匹配IP地址IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。
句点在正则表达式中的特殊含义本文前面已经介绍。
日志记录的时间部分由一对方括号包围。
你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。
图九显示了这部分的正则表达式。
图九:匹配至少一个字符,直至找到“]”现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。
注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“\s-\s-\s”。
完整的正则表达式如图十所示。
图十:匹配IP地址和时间标记现在正则表达式已经编写完毕,接下来可以编写使用正则表达式库的Java代码了。
为使用Jakarta-ORO库,首先创建正则表达式字符串和待分析的日志记录字符串:这里使用的正则表达式与图十的正则表达式差不多完全相同,但有一点例外:在Java中,你必须对每一个向前的斜杠(“\”)进行转义处理。