版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java中使用正则表达式验证本地化数据数据验证是编写任何用户界面时经常要处理的一项杂务。Java?语言的正则表达式支持可以使数据验证变得更容易。您可以定义一个正则表达式,用于描述有效数据,然后让Java运行时检查它是否匹配。但是有些类型的数据在不同地区有不同的格式。而ResourceBundle类让您可以以一种优雅的方式使用特定于地区的数据。本文展示如何结合这两种技术来解决常见的数据输入问题。本文讨论将正则表达式与JavaResourceBundle相结合的一种数据验证技术。Java语言对正则表达式的支持可以大大简化数据验证。您可以将数据与正则表达式进行比较,如果它们匹配,则知道数据是有效的。另一方面,JavaResourceBundle包含翻译好的字符串,用于匹配用户机器上的当前语言和国家设置。ResourceBundle中的字符串通常是出现在应用程序中的文本,但是也可以是特定于某个地区的任何东西。您将实践一个示例应用程序,该应用程序从ResourceBundles获得正则表达式,并将它们用于数据验证。通过这种方法,就可以用一块代码来验证很多不同类型的数据。更妙的是,随着更多ResourceBundle的添加,还可以验证更多类型的数据,并且不用更改这段代码中的任何一行。本文的示例应用程序是在Eclipse中用VisualEditor构建的。VisualEditor是一种用于构建图形化界面的开放源码工具。为了构建自己的应用程序,您需要在计算机上安装Eclipse和VisualEditor包。这个示例应用程序只是举例说明了验证数据的一种技巧,所以这种方法可用于任何Java应用程序。示例应用程序我不想花太多的时间讨论这个示例应用程序的所有细节,我只关注其中的数据验证方面的技巧。这个应用程序验证输入到输入域中的邮政编码。您可能知道,在世界的不同地方,邮政编码千差万别。有的是数字,有的则包含字母。即使同是由数字组成的邮政编码,在不同地方其长度也不尽相同。有的国家以特定的模式排列字母和数字,而另外一些国家则采用更自由的格式。所有这些格式都可以用正则表达式来描述。例如,在美国邮政编码是一个五位数,后面还可能跟有一个破折号加一个四位数。清单1展示了描述这种格式的正则表达式:清单1.用于美国邮政编码的正则表达式除了格式不同外,邮政编码并不总是被称为邮政编码。例如,美国将邮政编码称为ZIPCode。ResourceBundle的一种常见用法就是处理这种类型的与地区有关的差异。用于美国的ResourceBundle可能包含短语”EnteryourZIPCode",而在用于加拿大的ResourceBundle中,相应的短语可能是"Enteryourpostalcode"。我在本文中演示的技巧也是从ResourceBundle获得用于有效邮政编码的正则表达式。为了使这个示例简单化,您将创建一个只有一个输入域和一个Validate按钮的Swing应用程序。用户在输入域中输入文本,然后单击该按钮。如果数据与当前的正则表达式匹配,则应用程序显示一条消息,表明邮政编码有效。因为应用程序使用不同的ResourceBundle,所以正则表达式随着有效数据的规则的变化而变化。由于正则表达式是从文本文件中装载的一个字符串,所以当添加对新类型的邮政编码的支持时,不需要更改代码。您将在Eclipse中使用EclipseVisualEditor和EclipseJavaDevelopmentTool的一些特性来构建这个应用程序。您可以在几乎所有开发环境中使用这种技巧。这里的代码应该可以在任何基于Eclipse的产品中运行,例如RationalApplicationDeveloper。图1展示了该应用程序在EclipseVisualEditor中的样子:图1.EclipseVisualEditor中的示例应用程序
VisualEditor提供了四种查看应用程序的方式。在屏幕的顶端是应用程序的可视化图像,源代码在底端。Eclipse还提供了两个视图Properties视图和JavaBeans视图——可以通过这两个视图来处理应用程序。所有这些查看应用程序的方式都是由EclipseModelingFramework(EMF)控制的。由于已经有一些关于EMF的完整书籍,所以我不会再谈更多的细节。从程序员的角度来看,重要的一点是,任何视图中的变化都会自动发送到其他视图。例如,如果您使用Properties视图将一个对象的背景颜色设为绿色,那么可视化图像和源代码也会自动更新。众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。大家都知道,正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符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非空白符号[A\t\n\x0B\f\r]\w单独字符[a-zA-Z_0-9]\W非单独字符[Aa-zA-Z_0-9]\f换页符\eEscape\b一个单词的边界\B一个非单词的边界\G前一个匹配的结束人为限制开头Ajava条件限制为以Java为开头字符$为限制结尾java$条件限制为以java为结尾字符.条件限制除n以外任意一个单独字符java.,条件限制为java后除换行外任意两个字符加入特定限制条件「[]」[a-z]条件限制在小写atoz范围中一个字符[A-Z]条件限制在大写AtoZ范围中一个字符[a-zA-Z]条件限制在小写atoz或大写AtoZ范围中一个字符[0-9]条件限制在小写0to9范围中一个字符[0-9a-z]条件限制在小写0to9或atoz范围中一个字符[0-9[a-z]]条件限制在小写0to9或atoz范围中一个字符(交集)[]中加入人后加再次限制条件「[人]」[Aa-z]条件限制在非小写atoz范围中一个字符[AA-Z]条件限制在非大写AtoZ范围中一个字符[Aa-zA-Z]条件限制在非小写atoz或大写AtoZ范围中一个字符[A0-9]条件限制在非小写0to9范围中一个字符[A0-9a-z]条件限制在非小写0to9或atoz范围中一个字符[A0-9[a-z]]条件限制在非小写0to9或atoz范围中一个字符(交集)在限制条件为特定字符出现0次以上时,可以使用「*」J*0个以上J.*0个以上任意字符J.*DJ与D之间0个以上任意字符在限制条件为特定字符出现1次以上时,可以使用「+」J+1个以上J.+1个以上任意字符J.+DJ与D之间1个以上任意字符在限制条件为特定字符出现有0或1次以上时,可以使用「?」JA?J或者JA出现限制为连续出现指定次数字符「{a}」J{2}JJJ{3}JJJ文字a个以上,并且「{a,}」J{3,}JJJ,JJJJ,JJJJJ,???(3次以上J并存)文字个以上,b个以下「{a,b}」J{3,5}JJJ或JJJJ或JJJJJ两者取一「I」JIAJ或AJavalHelloJava或Hello「()」中规定一个组合类型比如,我查询<ahref=\"index.html\">index</a>中<ahref></a>间的数据,可写作va.*href=\”.*\”>(.+?)v/a>在使用Ppile函数时,可以加入控制正则表达式的匹配行为的参数:PatternPpile(Stringregex,intflag)flag的取值范围如下:Pattern.CANON_EQ当且仅当两个字符的”正规分解(canonicaldecomposition)"都完全相同的情况下,才认定匹配。比如用了这个标志之后,表达式”a\u030A”会匹配叩”。默认情况下,不考虑”规范相等性(canonicalequivalence)”。Pattern.CASE_INSENSITIVE(?i)默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。这个标志能让表达式忽略大小写进行匹配。要想对Unicode字符进行大小不明感的匹配,只要将UNICODE_CASE与这个标志合起来就行了。Pattern.COMMENTS(?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开头,任意结尾的字符串Patternpattern=Ppile("Java.*");Matchermatcher=pattern.matcher(不是人");booleanb=matcher.matches();/当条件满足时,将返回true否则返回falseSystem.out.println(b);♦以多条件分割字符串时Patternpattern=Ppile("[,|]+");String[]strs=pattern.split("JavaHelloWorldJava,Hello,,World|Sun");for(inti=0;i〈strs.length;i++){System.out.println(strs[i]);}♦文字替换(首次出现字符)Patternpattern=Pattern.coip贝l表达式");Matchermatcher=pattern.matc正则(表达式HelloWorldE则表达式HelloWorld");/替换第一个符合正则的数据System.out.println(matcher.replaceFirst("Java"));♦文字替换(全部)Patternpattern=Pattern.coEp贝l表达式");Matchermatcher=pattern.matc正则(表达式HelloWorldE则表达式HelloWorld");/替换第一个符合正则的数据System.out.println(matcher.replaceAll("Java"));♦文字替换(置换字符)Patternpattern=Ppile(”正则表达式");Matchermatcher=pattern.matcher("正则表达式HelloWorld正则表达式HelloWorld");StringBuffersbr=newStringBuffer();while(matcher.find())(matcher.appendReplacement(sbr,"Java");}matcher.appendTail(sbr);System.out.println(sbr.toString());♦验证是否为邮箱地址Stringstr="ceponline@";PatternpatternPpile("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+",Pattern.CASE_INSENSITIVE);Matchermatcher=pattern.matcher(str);System.out.println(matcher.matches());♦去除html标记Patternpattern=Ppile("<.+?>",Pattern.DOTALL);Matchermatcher=pattern.matcher("<ahref=\"index.html\">主页</a>");Stringstring=matcher.replaceAll("");System.out.println(string);♦查找html中对应条件字符串Patternpattern=Ppile("href=\"(.+?)\"");Matchermatcher=pattern.matcher("<ahref=\"index.html\">主页</a>");if(matcher.find())System.out.println(matcher.group(1));}♦截取http://地址〃截取urlPatternpattern=Ppile("(http://|https://){1}[\\w\\.\\-/:]+");Matchermatcher=pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf");StringBufferbuffer=newStringBuffer();while(matcher.find()){buffer.append(matcher.group());buffer.append("\r\n");System.out.println(buffer.toString());}♦替换指定{}中文字Stringstr="Java目前的发展史是由{0}年-{1}年”;String[川object={newString[]{"\\{0\\}”,"1995"},newString[]{"\\{1\\}”,"2007"}};System.out.println(replace(str,object));publicstaticStringreplace(finalStringsourceString,Object[]object){Stringtemp=sourceString;for(inti=0;i<object.length;i++){String[]result=(String[])object[i];Patternpattern=Ppile(result[0]);Matchermatcher=pattern.matcher(temp);temp=matcher.replaceAll(result[1]);}returntemp;}♦以正则条件查询指定目录下文件〃用于缓存文件列表privateArrayListfiles=newArrayList();〃用于承载文件路径privateString_path;〃用于承载未合并的正则公式privateString_regexp;classMyFileFilterimplementsFileFilter{/***匹配文件名称*/publicbooleanaccept(Filefile){try{Patternpattern=Ppile(_regexp);Matchermatch=pattern.matcher(file.getName());returnmatch.matches();}catch(Exceptione){returntrue;}}}/***解析输入流@paraminputs*/F
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度融资租赁行业研究合同2篇
- 2025年度航空航天用高性能铝合金门窗供应合同4篇
- 二零二五年度长途汽车运输服务合同标准4篇
- 2025年度旅游行业数据分析与应用合同4篇
- 二零二五年度不锈钢装饰材料定制与销售合同3篇
- 四川省峨眉山市达标名校2025届中考考前最后一卷生物试卷含解析
- 二零二五年度绿色有机大米购销合作协议范本3篇
- 13 种煤矿安全监察 执法文书样式
- 5G-Advanced通感融合仿真评估方法研究报告
- 二零二五年度航空航天器零部件安装合同3篇
- (二统)大理州2025届高中毕业生第二次复习统一检测 物理试卷(含答案)
- 影视作品价值评估-洞察分析
- 公司员工出差车辆免责协议书
- 2023年浙江杭州师范大学附属医院招聘聘用人员笔试真题
- 江苏某小区园林施工组织设计方案
- 口腔执业医师定期考核试题(资料)带答案
- 2024人教版高中英语语境记单词【语境记单词】新人教版 选择性必修第2册
- 能源管理总结报告
- 药店医保政策宣传与执行制度
- 勘察工作质量及保证措施
- 体外膜肺氧合(ECMO)并发症及护理
评论
0/150
提交评论