java中的正则表达式

java中的正则表达式
java中的正则表达式

Java中使用正则表达式验证本地化数据

数据验证是编写任何用户界面时经常要处理的一项杂务。Java? 语言的正则表达式支持可以使数据验证变得更容易。您可以定义一个正则表达式,用于描述有效数据,然后让Java 运行时检查它是否匹配。但是有些类型的数据在不同地区有不同的格式。而ResourceBundle 类让您可以以一种优雅的方式使用特定于地区的数据。本文展示如何结合这两种技术来解决常见的数据输入问题。

本文讨论将正则表达式与Java ResourceBundle 相结合的一种数据验证技术。Java 语言对正则表达式的支持可以大大简化数据验证。您可以将数据与正则表达式进行比较,如果它们匹配,则知道数据是有效的。另一方面,Java ResourceBundle 包含翻译好的字符串,用于匹配用户机器上的当前语言和国家设置。ResourceBundle 中的字符串通常是出现在应用程序中的文本,但是也可以是特定于某个地区的任何东西。

您将实践一个示例应用程序,该应用程序从ResourceBundles 获得正则表达式,并将它们用于数据验证。通过这种方法,就可以用一块代码来验证很多不同类型的数据。更妙的是,随着更多ResourceBundle 的添加,还可以验证更多类型的数据,并且不用更改这段代码中的任何一行。

本文的示例应用程序是在Eclipse 中用Visual Editor 构建的。Visual Editor 是一种用于构建图形化界面的开放源码工具。为了构建自己的应用程序,您需要在计算机上安装Eclipse 和Visual Editor 包。这个示例应用程序只是举例说明了验证数据的一种技巧,所以这种方法可用于任何Java 应用程序。

示例应用程序

我不想花太多的时间讨论这个示例应用程序的所有细节,我只关注其中的数据验证方面的技巧。这个应用程序验证输入到输入域中的邮政编码。您可能知道,在世界的不同地方,邮政编码千差万别。有的是数字,有的则包含字母。即使同是由数字组成的邮政编码,在不同地方其长度也不尽相同。有的国家以特定的模式排列字母和数字,而另外一些国家则采用更自由的格式。所有这些格式都可以用正则表达式来描述。例如,在美国邮政编码是一个五位数,后面还可能跟有一个破折号加一个四位数。清单1 展示了描述这种格式的正则表达式:

清单 1. 用于美国邮政编码的正则表达式

除了格式不同外,邮政编码并不总是被称为邮政编码。例如,美国将邮政编码称为ZIP Code。ResourceBundle 的一种常见用法就是处理这种类型的与地区有关的差异。用于美国的ResourceBundle 可能包含短语"Enter your ZIP Code",而在用于加拿大的ResourceBundle 中,相应的短语可能是"Enter your postal code"。我在本文中演示的技巧也是从ResourceBundle 获得用于有效邮政编码的正则表达式。

为了使这个示例简单化,您将创建一个只有一个输入域和一个Validate按钮的Swing 应用程序。用户在输入域中输入文本,然后单击该按钮。如果数据与当前的正则表达式匹配,则应用程序显示一条消息,表明邮政编码有效。因为应用程序使用不同的ResourceBundle,所以正则表达式随着有效数据的规则的变化而变化。由于正则表达式是从文本文件中装载的一个字符串,所以当添加对新类型的邮政编码的支持时,不需要更改代码。

您将在Eclipse 中使用Eclipse Visual Editor 和Eclipse Java Development Tool 的一些特性来构建这个应用程序。您可以在几乎所有开发环境中使用这种技巧。这里的代码应该可以在任何基于Eclipse 的产品中运行,例如Rational Application Developer。

图1 展示了该应用程序在Eclipse Visual Editor 中的样子:

图 1. Eclipse Visual Editor 中的示例应用程序

Visual Editor 提供了四种查看应用程序的方式。在屏幕的顶端是应用程序的可视化图像,源代码在底端。Eclipse 还提供了两个视图——Properties 视图和Java Beans 视图——可以通过这两个视图来处理应用程序。所有这些查看应用程序的方式都是由Eclipse Modeling Framework (EMF) 控制的。由于已经有一些关于EMF 的完整书籍,所以我不会再谈更多的细节。从程序员的角度来看,重要的一点是,任何视图中的变化都会自动发送到其他视图。例如,如果您使用Properties 视图将一个对象的背景颜色设为绿色,那么可视化图像和源代码也会自动更新。

众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。

大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在

查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

自从jdk1.4推出java.util.regex包,就为我们提供了很好的JA V A正则表达式应用平台。

因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。

\\ 反斜杠

\t 间隔('\u0009')

\n 换行('\u000A')

\r 回车('\u000D')

\d 数字等价于[0-9]

\D 非数字等价于[^0-9]

\s 空白符号[\t\n\x0B\f\r]

\S 非空白符号[^\t\n\x0B\f\r]

\w 单独字符[a-zA-Z_0-9]

\W 非单独字符[^a-zA-Z_0-9]

\f 换页符

\e Escape

\b 一个单词的边界

\B 一个非单词的边界

\G 前一个匹配的结束

^为限制开头

^java 条件限制为以Java为开头字符

$为限制结尾

java$ 条件限制为以java为结尾字符

. 条件限制除\n以外任意一个单独字符

java.. 条件限制为java后除换行外任意两个字符

加入特定限制条件「[]」

[a-z] 条件限制在小写a to z范围中一个字符

[A-Z] 条件限制在大写A to Z范围中一个字符

[a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符

[0-9] 条件限制在小写0 to 9范围中一个字符

[0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符

[0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)

[]中加入^后加再次限制条件「[^]」

[^a-z] 条件限制在非小写a to z范围中一个字符

[^A-Z] 条件限制在非大写A to Z范围中一个字符

[^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符

[^0-9] 条件限制在非小写0 to 9范围中一个字符

[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符

[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)

在限制条件为特定字符出现0次以上时,可以使用「*」

J* 0个以上J

.* 0个以上任意字符

J.*D J与D之间0个以上任意字符

在限制条件为特定字符出现1次以上时,可以使用「+」

J+ 1个以上J

.+ 1个以上任意字符

J.+D J与D之间1个以上任意字符

在限制条件为特定字符出现有0或1次以上时,可以使用「?」

JA? J或者JA出现

限制为连续出现指定次数字符「{a}」

J{2} JJ

J{3} JJJ

文字a个以上,并且「{a,}」

J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J并存)

文字个以上,b个以下「{a,b}」

J{3,5} JJJ或JJJJ或JJJJJ

两者取一「|」

J|A J或A

Java|Hello Java或Hello

「()」中规定一个组合类型

比如,我查询index间的数据,可写作(.+?)

在使用https://www.360docs.net/doc/a01652600.html,pile函数时,可以加入控制正则表达式的匹配行为的参数:

Pattern https://www.360docs.net/doc/a01652600.html,pile(String regex, int flag)

flag的取值范围如下:

Pattern.CANON_EQ 当且仅当两个字符的"正规分解(canonical decomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a\u030A"会匹配"?"。默认情况下,不考虑"规范相等性(canonical equivalence)"。

Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII 字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。

https://www.360docs.net/doc/a01652600.html,MENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的"\\s",而是指表达式里的空格,tab,回车之类)。注释从#开始,一直到这行结束。可以通过嵌入式的标志来启用Unix行模式。

Pattern.DOTALL(?s) 在这种模式下,表达式'.'可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式'.'不匹配行的结束符。

Pattern.MULTILINE

(?m) 在这种模式下,'^'和'$'分别匹配一行的开始和结束。此外,'^'仍然匹配字符串的开始,'$'也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。Pattern.UNICODE_CASE

(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode 字符进行大小写不明感的匹配。默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集。

Pattern.UNIX_LINES(?d) 在这个模式下,只有'\n'才被认作一行的中止,并且与'.','^',以及'$'进行匹配。

抛开空泛的概念,下面写出几个简单的Java正则用例:

◆比如,在字符串包含验证时

//查找以Java开头,任意结尾的字符串

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("^Java.*");

Matcher matcher = pattern.matcher("Java不是人");

boolean b= matcher.matches();

//当条件满足时,将返回true,否则返回false

System.out.println(b);

◆以多条件分割字符串时

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("[, |]+");

String[] strs = pattern.split("Java Hello World Java,Hello,,World|Sun");

for (int i=0;i

System.out.println(strs[i]);

}

◆文字替换(首次出现字符)

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("正则表达式");

Matcher matcher = pattern.matcher("正则表达式Hello World,正则表达式Hello World");

//替换第一个符合正则的数据

System.out.println(matcher.replaceFirst("Java"));

◆文字替换(全部)

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("正则表达式");

Matcher matcher = pattern.matcher("正则表达式Hello World,正则表达式Hello World");

//替换第一个符合正则的数据

System.out.println(matcher.replaceAll("Java"));

◆文字替换(置换字符)

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("正则表达式");

Matcher matcher = pattern.matcher("正则表达式Hello World,正则表达式Hello World "); StringBuffer sbr = new StringBuffer();

while (matcher.find()) {

matcher.appendReplacement(sbr, "Java");

}

matcher.appendTail(sbr);

System.out.println(sbr.toString());

◆验证是否为邮箱地址

String str="ceponline@https://www.360docs.net/doc/a01652600.html,";

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(str);

System.out.println(matcher.matches());

◆去除html标记

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("<.+?>", Pattern.DOTALL);

Matcher matcher = pattern.matcher("主页");

String string = matcher.replaceAll("");

System.out.println(string);

◆查找html中对应条件字符串

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("href=\"(.+?)\"");

Matcher matcher = pattern.matcher("主页");

if(matcher.find())

System.out.println(matcher.group(1));

}

◆截取http://地址

//截取url

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile("(http://|https://){1}[\\w\\.\\-/:]+");

Matcher matcher = pattern.matcher("dsdsdsfdf");

StringBuffer buffer = new StringBuffer();

while(matcher.find()){

buffer.append(matcher.group());

buffer.append("\r\n");

System.out.println(buffer.toString());

}

◆替换指定{}中文字

String str = "Java目前的发展史是由{0}年-{1}年";

String[][] object={new String[]{"\\{0\\}","1995"},new String[]{"\\{1\\}","2007"}}; System.out.println(replace(str,object));

public static String replace(final String sourceString,Object[] object) {

String temp=sourceString;

for(int i=0;i

String[] result=(String[])object[i];

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile(result[0]);

Matcher matcher = pattern.matcher(temp);

temp=matcher.replaceAll(result[1]);

}

return temp;

}

◆以正则条件查询指定目录下文件

//用于缓存文件列表

private ArrayList files = new ArrayList();

//用于承载文件路径

private String _path;

//用于承载未合并的正则公式

private String _regexp;

class MyFileFilter implements FileFilter {

/**

* 匹配文件名称

*/

public boolean accept(File file) {

try {

Pattern pattern = https://www.360docs.net/doc/a01652600.html,pile(_regexp);

Matcher match = pattern.matcher(file.getName());

return match.matches();

} catch (Exception e) {

return true;

}

}

}

/**

* 解析输入流

* @param inputs

*/

FilesAnalyze (String path,String regexp){

getFileName(path,regexp);

}

/**

* 分析文件名并加入files

* @param input

*/

private void getFileName(String path,String regexp) { //目录

_path=path;

_regexp=regexp;

File directory = new File(_path);

File[] filesFile = directory.listFiles(new MyFileFilter());

if (filesFile == null) return;

for (int j = 0; j < filesFile.length; j++) {

files.add(filesFile[j]);

}

return;

}

/**

* 显示输出信息

* @param out

*/

public void print (PrintStream out) {

Iterator elements = files.iterator();

while (elements.hasNext()) {

File file=(File) elements.next();

out.println(file.getPath());

}

}

public static void output(String path,String regexp) {

FilesAnalyze fileGroup1 = new FilesAnalyze(path,regexp);

fileGroup1.print(System.out);

}

public static void main (String[] args) {

output("C:\\","[A-z|.]*");

}

Java正则的功用还有很多,事实上只要是字符处理,就没有正则做不到的事情存在

正则表达式

本文分十四个类别对正则表达式的意义进行了解释,这十四各类别是:字符/字符类/预定义字符类/POSIX字符类/https://www.360docs.net/doc/a01652600.html,ng.Character类/Unicode块和类别的类/边界匹配器/Greedy数量词/Reluctant数量词/Possessive数量词/Logical运算符/Back引用/引用/特殊构造。 1.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') \cx 对应于 x 的控制符 1.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](减去) 1.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] 1.4.POSIX 字符类(仅 US-ASCII)(注意反斜杠要写两次,例如\p{Lower}写为\\p{Lower})

JAVA正则表达式 Pattern和Matcher

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher 。 Pattern:一个Pattern是一个正则表达式经编译后的表现模式。 Matcher:一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 以下我们就分别来看看这两个类: 2.Pattern类: Pattern的方法如下: static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类 static Pattern compile(String regex, int flags) 同上,但增加flag参数的指定,可选的flag参数包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ int flags() 返回当前Pattern的匹配flag参数. Matcher matcher(CharSequence input) 生成一个给定命名的Matcher对象 static boolean matches(String regex, CharSequence input) 编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况,也就是只进行一次匹配工作,因为这种情况下并不需要生成一个Matcher实例。 String pattern() 返回该Patter对象所编译的正则表达式。 String[] split(CharSequence input) 将目标字符串按照Pattern里所包含的正则表达式为模进行分割。 String[] split(CharSequence input, int limit) 作用同上,增加参数limit目的在于要指定分割的段数,如将limi设为2,那么目标字符串将根据正则表达式分为割为两段。

java中正则表达式的使用

Java代码 1.Java中在某个字符串中查询某个字符或者某个子字串Java代码

Java代码 3.对字符串的分割 Java代码 如果用正则表达式分割就如上所示,一般我们都会使用下面更简单的方法:Java代码 4.字符串的替换/删除 Java代码 如果要把字符串中的@都给删除,只用要空字符串替换就可以了: Java代码

注:对Pattern类的说明: 1.public final class java.util.regex.Pattern是正则表达式编译后的表达法。 下面的语句将创建一个Pattern对象并赋值给句柄pat:Pattern pat = https://www.360docs.net/doc/a01652600.html,pile(regEx); 有趣的是,Pattern类是final类,而且它的构造器是private。也许有人告诉你一些设计模式的东西,或者你自己查有关资料。这里的结论是:Pattern类不能被继承,我们不能通过new创建Pattern类的对象。 因此在Pattern类中,提供了2个重载的静态方法,其返回值是Pattern对象(的引用)。如:Java代码 1.public static Pattern compile(String regex) { 2.return new Pattern(regex, 0); 3.} 当然,我们可以声明Pattern类的句柄,如Pattern pat = null; 2.pat.matcher(str)表示以用Pattern去生成一个字符串str的匹配器,它的返回值是一个Matcher类的引用。 我们可以简单的使用如下方法:boolean rs = https://www.360docs.net/doc/a01652600.html,pile(regEx).matcher(str).find();

java正则表达式验证格式(邮箱电话号码)

Java正则表达式验证格式(邮箱、电话号码) package com.firewolf.utils;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 使用正则表达式验证输入格式* @author liuxing * */public class RegexValidateUtil { public static void main(String[] args) { System.out.println(checkEmail("14_8@qw.df")); System.out.println(checkMobileNumber("071-3534452")); } /** * 验证邮箱* @param email * @return */ public static boolean checkEmail(String email){ boolean flag = false; try{ String check = "^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0 -9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; Pattern regex = https://www.360docs.net/doc/a01652600.html,pile(check); Matcher matcher = regex.matcher(email); flag = matcher.matches(); }catch(Exception e){ flag = false; } return flag; } /** * 验证手机号码* @param mobiles * @return */ public static boolean checkMobileNumber(String

Java中的正则表达式+--++示例详解

Java中的正则表达式 众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从jdk1.4推出java.util.regex包,就为我们提供了很好的JAVA正则表达式应用平台。 因为正则表达式是一个很庞杂的体系,所以我仅例举些入门的概念,更多的请参阅相关书籍及自行摸索。 \\ 反斜杠 \t 间隔 ('\u0009') \n 换行 ('\u000A') \r 回车 ('\u000D') \d 数字等价于[0-9] \D 非数字等价于[^0-9] \s 空白符号 [\t\n\x0B\f\r] \S 非空白符号 [^\t\n\x0B\f\r] \w 单独字符 [a-zA-Z_0-9] \W 非单独字符 [^a-zA-Z_0-9] \f 换页符 \e Escape \b 一个单词的边界 \B 一个非单词的边界 \G 前一个匹配的结束 ^为限制开头 ^java 条件限制为以Java为开头字符 $为限制结尾 java$ 条件限制为以java为结尾字符 .为限制一个任意字符 java.. 条件限制为java后除换行外任意两个字符 加入特定限制条件「[]」 [a-z] 条件限制在小写a to z范围中一个字符 [A-Z] 条件限制在大写A to Z范围中一个字符 [a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符 [0-9] 条件限制在小写0 to 9范围中一个字符

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“或”符号

轻松学会JAVA中的正则表达式

正则表达式是JA V A语言中比较困难的内容我从网上找了一篇很不错的文章愿与大家分享共同进步 内容如下: 正则表达式之道 原著:Steve Mansour sman@https://www.360docs.net/doc/a01652600.html, Revised: June 5, 1999 (copied by jm /at/ https://www.360docs.net/doc/a01652600.html, from https://www.360docs.net/doc/a01652600.html,/%7esman/regexp.htm, after the original disappeared! ) 翻译:Neo Lee neo.lee@https://www.360docs.net/doc/a01652600.html, 2004年10月16日 英文版原文 译者按:原文因为年代久远,文中很多链接早已过期(主要是关于vi、sed等工具的介绍和手册),本译文中已将此类链接删除,如需检查这些链接可以查看上面链接的原文。除此之外基本照原文直译,括号中有“译者按”的部分是译者补充的说明。如有内容方面的问题请直接和Steve Mansor联系,当然,如果你只写中文,也可以和我联系。 目录 什么是正则表达式 范例 简单 中级(神奇的咒语) 困难(不可思议的象形文字) 不同工具中的正则表达式 什么是正则表达式 一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用——很不幸,这篇文章也不能够改变这一点,不过,经过一点点练习之后我就开始觉得这些复杂的表达式其实写起来还是相当简单的,而且,一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟(甚至几秒钟)内完成。正则表达式被各种文本编辑软件、类库(例如Rogue Wave的tools.h++)、脚本工具(像awk/grep/sed)广泛的支持,而且像Microsoft的V isual C++这种交互式IDE也开始支持它了。 我们将在如下的章节中利用一些例子来解释正则表达式的用法,绝大部分的例子是基于vi 中的文本替换命令和grep文件搜索命令来书写的,不过它们都是比较典型的例子,其中的概念可以在sed、awk、perl和其他支持正则表达式的编程语言中使用。你可以看看不同工具中的正则表达式这一节,其中有一些在别的工具中使用正则表达式的例子。还有一个关于vi中文本替换命令(s)的简单说明附在文后供参考。 正则表达式基础

Java常用的正则表达式验证

1public class Regex { 2 3/** 4* 检查 email输入是否正确 5* 正确的书写格式为 username@domain 6* @param value 7* @return 8*/ 9public boolean checkEmail(String value, int length) { 10return value.matches("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*")&&value.l ength()<=length; 11 } 12 13/** 14* 检查电话输入是否正确 15* 正确格式 012-87654321、0123-87654321、0123-7654321 16* @param value 17* @return 18*/ 19public boolean checkTel(String value) { 20return value.matches("\\d{4}-\\d{8}|\\d{4}-\\d{7}|\\d(3)-\\d(8)"); 21 } 22 23/** 24* 检查手机输入是否正确 25* 26* @param value 27* @return 28*/ 29public boolean checkMobile(String value) { 30return value.matches("^[1][3,5]+\\d{9}"); 31 } 32 33/** 34* 检查中文名输入是否正确 35* 36* @param value 37* @return 38*/ 39public boolean checkChineseName(String value, int length) { 40return value.matches("^[\u4e00-\u9fa5]+$")&&value.length()<=length; 41 } 42/**

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]。 \p{U pper} 大写字母字符:[A-Z] \p{A SCII} 所有 A SCII:[\x00-\x7F] \p{A lpha} 字母字符:[\p{Lower}\p{U pper}] \p{Digit} 十进制数字:[0-9] \p{A lnum} 字母数字字符:[\p{A lpha}\p{Digit}] \p{P unc t} 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ \p{Graph} 可见字符:[\p{A lnum}\p{Punc t}] \p{P rint} 可打印字符:[\p{Graph}\x20]

java中的正则表达式

Java中使用正则表达式验证本地化数据 数据验证是编写任何用户界面时经常要处理的一项杂务。Java? 语言的正则表达式支持可以使数据验证变得更容易。您可以定义一个正则表达式,用于描述有效数据,然后让Java 运行时检查它是否匹配。但是有些类型的数据在不同地区有不同的格式。而ResourceBundle 类让您可以以一种优雅的方式使用特定于地区的数据。本文展示如何结合这两种技术来解决常见的数据输入问题。 本文讨论将正则表达式与Java ResourceBundle 相结合的一种数据验证技术。Java 语言对正则表达式的支持可以大大简化数据验证。您可以将数据与正则表达式进行比较,如果它们匹配,则知道数据是有效的。另一方面,Java ResourceBundle 包含翻译好的字符串,用于匹配用户机器上的当前语言和国家设置。ResourceBundle 中的字符串通常是出现在应用程序中的文本,但是也可以是特定于某个地区的任何东西。 您将实践一个示例应用程序,该应用程序从ResourceBundles 获得正则表达式,并将它们用于数据验证。通过这种方法,就可以用一块代码来验证很多不同类型的数据。更妙的是,随着更多ResourceBundle 的添加,还可以验证更多类型的数据,并且不用更改这段代码中的任何一行。 本文的示例应用程序是在Eclipse 中用Visual Editor 构建的。Visual Editor 是一种用于构建图形化界面的开放源码工具。为了构建自己的应用程序,您需要在计算机上安装Eclipse 和Visual Editor 包。这个示例应用程序只是举例说明了验证数据的一种技巧,所以这种方法可用于任何Java 应用程序。 示例应用程序 我不想花太多的时间讨论这个示例应用程序的所有细节,我只关注其中的数据验证方面的技巧。这个应用程序验证输入到输入域中的邮政编码。您可能知道,在世界的不同地方,邮政编码千差万别。有的是数字,有的则包含字母。即使同是由数字组成的邮政编码,在不同地方其长度也不尽相同。有的国家以特定的模式排列字母和数字,而另外一些国家则采用更自由的格式。所有这些格式都可以用正则表达式来描述。例如,在美国邮政编码是一个五位数,后面还可能跟有一个破折号加一个四位数。清单1 展示了描述这种格式的正则表达式: 清单 1. 用于美国邮政编码的正则表达式

JAVA 正则表达式4种常用的功能

JAVA 正则表达式4种常用的功能下面简单的说下它的4种常用功能: 查询: 以下是代码片段: String str="abc efg ABC"; String regEx="a|f"; //表示a或f Pattern p=https://www.360docs.net/doc/a01652600.html,pile(regEx); Matcher m=p.matcher(str); boolean rs=m.find(); 如果str中有regEx,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成Pattern p=https://www.360docs.net/doc/a01652600.html,pile(regEx,Pattern.CASE_INSENSITIVE); 提取: 以下是代码片段: String regEx=".+\(.+)$"; String str="c:\dir1\dir2\name.txt"; Pattern p=https://www.360docs.net/doc/a01652600.html,pile(regEx); Matcher m=p.matcher(str); boolean rs=m.find(); for(int i=1;i<=m.groupCount();i++){ System.out.println(m.group(i)); } 以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为

m.groupCount(); 分割: 以下是代码片段: String regEx="::"; Pattern p=https://www.360docs.net/doc/a01652600.html,pile(regEx); String[] r=p.split("xd::abc::cde"); 执行后,r就是{"xd","abc","cde"},其实分割时还有跟简单的方法:String str="xd::abc::cde"; String[] r=str.split("::"); 替换(删除): 以下是代码片段: String regEx="a+"; //表示一个或多个a Pattern p=https://www.360docs.net/doc/a01652600.html,pile(regEx); Matcher m=p.matcher("aaabbced a ccdeaa"); String s=m.replaceAll("A"); 结果为"Abbced A ccdeA" 如果写成空串,既可达到删除的功能,比如: String s=m.replaceAll(""); 结果为"bbced ccde" 附: \D 等於[^0-9] 非数字 \s 等於[ \t\n\x0B\f ] 空白字元 \S 等於[^ \t\n\x0B\f ] 非空白字元 \w 等於[a-zA-Z_0-9] 数字或是英文字 \W 等於[^a-zA-Z_0-9] 非数字与英文字

java正则表达式分析

Java 正则表达式 正则表达式定义了字符串的模式。 正则表达式可以用来搜索、编辑或处理文本。 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。 Java 正则表达式和Perl 的是最为相似的。 java.util.regex 包主要包括以下三个类: ?Pattern 类: pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。 ? ?Matcher 类: Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用Pattern 对象的matcher 方法来获得一个Matcher 对象。 ? ?PatternSyntaxException: PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。 ? 捕获组 捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。 例如,正则表达式(dog) 创建了单一分组,组里包含"d","o",和"g"。 捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组: ?((A)(B(C))) ?(A) ?(B(C))

?(C) 可以通过调用matcher 对象的groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个int 值,表示matcher对象当前有多个捕获组。 还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在groupCount 的返回值中。 实例 下面的例子说明如何从一个给定的字符串中找到数字串: RegexMatches.java 文件代码: 以上实例编译运行结果如下: 正则表达式语法

Java中正则表达式的一个简单例子

Java中正则表达式的一个简单例子 本文由广州疯狂软件java培训分享: import ; public class regexTest { // 新建类 public static void main(String[] args){ // 主方法 Scanner sc = new Scanner(System.in); // new Scanner类对象 "Please Enter Email:"); String email = sc.nextLine(); "Please Enter Mobile:"); String mobile = sc.nextLine(); String Email_regex= "\\w+@\\w+\\.\\w{2,3}"; String Mobile_regex= "^((13[0-9])|(15[0-9])|(18[0-9]))\\d{8}";//设定手机号码正则表达式规则13*,15*,18* if(email.matches(Email_regex)){ + "是个合法的Email Address!"); } else{ + "是个非法的Email Address!"); } if(mobile.matches(Mobile_regex)){ + "是个合法的手机号码"); } else{ + "是个非法的手机号码"); } } } 在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它用以描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从jdk1.4推出,就为我们提供了很好的JA V A正则表达式应用平台。 常见的正则表达式规则 匹配特定数字: ^[1-9]d*$//匹配正整数 ^-[1-9]d*$ //匹配负整数 ^-?[1-9]d*$//匹配整数 ^[1-9]d*|0$//匹配非负整数(正整数+ 0) ^-[1-9]d*|0$//匹配非正整数(负整数+ 0) ^[1-9]d*.d*|0.d*[1-9]d*$//匹配正浮点数

JAVA正则表达式语法

JA V A正则表达式语法 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 正则表达式示例 表达式匹配 /^\s*$/ 匹配空行。 /\d{2}-\d{5}/ 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 标记。 下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。 ^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与“\n”或“\r”之前的位置匹配。 * 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。 +

一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。 ? 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 {n} n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 {n,} n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效于“o+”。“o{0,}”等效于“o*”。 {n,m} M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。 ? 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。 . 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。 (pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用$0…$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。 (?:pattern)

java正则表达式判断数字

java正则表达式判断数字 "^\\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+)?$" //浮点数 2)var r = /^\+?[1-9][0-9]*$/; //正整数 r.test(str); /** * 判断mac地址是否合法, * 要求连接符必须为冒号 * * @author jwang * @date 2013.4.19 * @param macAddress

* @return */ private static boolean isMacAddress(String macAddress){ String reg = "^([0-9a-fA-F]){2}([:][0-9a-fA-F]{2}){5}"; return https://www.360docs.net/doc/a01652600.html,pile(reg).matcher(macAddress).find(); }

java中的日期验证正则表达式

@Test public void Testregexp(){ //Pattern p = https://www.360docs.net/doc/a01652600.html,pile("^((\\d{2}(([02468][048])|([13579][26]))[\\/\\/\\s]?((((0?"+"[13578])|( 1[02]))[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))" +"|(((0?[469])|(11))[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|" +"(0?2[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][12"+"35679])|([13579][0 1345789]))[\\/\\/\\s]?((((0?[13578])|(1[02]))" +"[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))" +"[\\/\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\/\\/\\s]?((0?[" +"1-9])|(1[0-9])|(2[0-8]))))))"); Pattern p = https://www.360docs.net/doc/a01652600.html,pile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\-\\s]?((((0?" +"[13578])|(1[02]))[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))" +"|(((0?[469])|(11))[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(30)))|" +"(0?2[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][12" +"35679])|([13579][01345789]))[\\-\\-\\s]?((((0?[13578])|(1[02]))" +"[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))" +"[\\-\\-\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\-\\s]?((0?[" +"1-9])|(1[0-9])|(2[0-8]))))))"); String s = "2003-02-20"; System.out.println(s + " " + p.matcher(s).matches()); s = "2004/02/29"; System.out.println(s + " " + p.matcher(s).matches()); s = "2004/04/31"; System.out.println(s + " " + p.matcher(s).matches()); s = "2004/04/30"; System.out.println(s + " " + p.matcher(s).matches()); s = "2004/04/30"; System.out.println(s + " " + p.matcher(s).matches()); s = "2004/09/30"; System.out.println(s + " " + p.matcher(s).matches()); } 以上运行结果: 2003-02-20 true 2004/02/29 false 2004/04/31 false 2004/04/30 false

Java正则表达式使用详解(2015版)

Java正则表达式使用详解 2015年4月15日修订 如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。 许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可。 一、正则表达式基础知识 我们先从简单的开始。假设你要搜索一个包含字符“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 表示匹配次数的符号 表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:

java中的日期验证正则表达式

public static void main(String[] args) { String checkValue = "20000431112230"; String year = checkValue.substring(0, 4); // 获取年份 String month = checkValue.substring(4, 6); // 获取月份 Boolean isLeap = leapYear(Integer.parseInt(year)); // 判断闰年 System.out.println(isLeap); StringBuffer eL= new StringBuffer(); String longMonth = "01030507081012"; // 31天的月份 String fix = "([2][0-3]|[0-1][0-9]|[1-9])[0-5][0-9]([0-5][0-9]|[6][0])"; if(isLeap && month.equals("02")){ // 针对2月份的情况【闰年】eL.append("\\d{4}([1][0-2]|[0][0-9])([2][0-1]|[1-2][0-9] |[0][1-9]|[1-9])"+fix); }else if(!isLeap && month.equals("02")){ // 针对2月份的情况【非闰年】 eL.append("\\d{4}([1][0-2]|[0][0-9])([2][0-1]|[1-2][0-8] |[0][1-9]|[1-9])"+fix); }else if(longMonth.contains(month)){ // 31天月份 eL.append("\\d{4}([1][0-2]|[0][0-9])([3][0-1]|[1-2][0-9] |[0][1-9]|[1-9])"+fix); }else{ // 30天月份 eL.append("\\d{4}([1][0-2]|[0][0-9])([3][0]|[1-2][0-9]|[ 0][1-9]|[1-9])"+fix); } Pattern p = https://www.360docs.net/doc/a01652600.html,pile(eL.toString()); Matcher m = p.matcher(checkValue); boolean flag = m.matches(); if(flag ) { System.out.println("格式正确"); } else { System.out.println("格式错误"); } } public static boolean leapYear(int year) { Boolean isLeap = false; if(((year % 100== 0) && (year % 400== 0)) || ((year % 100!= 0) && (year % 4== 0)))

相关文档
最新文档