`
zhiweiofli
  • 浏览: 511839 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

强悍的正则表达式

 
阅读更多

     在编写程序时,时常会遇到要替换掉字符串中的某部分,或者找出某部分,又或者删除某部分,总之就是字符串匹配的问题。

     Java的String类也提供了强大的字符串处理函数,例如split,subString,index,replace等等,在简单的场合,也许他们已经够用了,可是在一些重复性大,批量操作的情况下,他们就得配合一个工具,来扩充他们的能力了,那是一个强大而且通用的工具--正则表达式!

     今天我就遇到一个问题,需要在每次的http请求中更改其请求的IP地址!也就是IP匹配,单单匹配IP就简单得多,看下面的正则表达式:

"(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
  "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
  "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
  "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))";

 逐个分解:

(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5]))).
  •  “|”,这个在Java的逻辑表达式里就是表示“或"的符号,这里也是,所以我们按”|“把上面的表达式分解;
  •  [1-9],这表示一个数字,其取值范围是1到9,当然[1-9][1-9]就表示两位数,如此类推;
  •  (1[0-9][0-9]|(2[0-4][0-9]|25[0-5])),这里面的(),表示一个集合,值可以去里面的表达式结果,分解里面就是1[0-9][0-9]和(2[0-4][0-9]|25[0-5]);
  • 1[0-9][0-9]表示取值范围100到199的数字;
  • (2[0-4][0-9]|25[0-5])表示取200到249,或250到255的数字,很明显这是IP字段的取值范围,正则表达式也就这样做了判断!

 

     当然,抛开精度的话,也可以写成这样子:(\\d+).(\\d+).(\\d+).(\\d+)

\d+表示取任意位数的数字


     不过这里要注意,我在这里写的都是在Java字符里串用的,所以在\d+前面要加上”\“转义字符,不然在Java的编译器里会报错!

 

       不过我的需求还没完,还需要匹配端口!

       有了上面的基础,下面的小要求,就简单了:

"\\//(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
    "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
    "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
    "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))(:\\d+\\/|\\/)"

       分别在前面增加匹配”//"的,以及在后面增加匹配":*"/和"/",这里面分两种情况,一是有端口的,二是没有端口的,所以中间用了一个“|”。

完整的函数见下面:

	/**
	 * 当配置为空,则返回原来的URL
	 * @param orgUrl
	 * @return 
	 */
	private String replaceImageUrl(String orgUrl){
		
		String result = orgUrl;
		
		String serverIp = Info.getImageServerUrl();
		
		if(!serverIp.equals("")){
			serverIp = "//" + serverIp + "/";
			result = orgUrl.replaceFirst(IP_Format, serverIp);
		}
		
		return result;
	}
	/***
	 * 识别以//开头的,以/结尾的包含IP和端口的正则表达式
	 */
	private String IP_Format = "\\//(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
    "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
    "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))." +
    "(0|[1-9]|[1-9][0-9]|(1[0-9][0-9]|(2[0-4][0-9]|25[0-5])))(:\\d+\\/|\\/)";

 

再附上收集回来的:

 

java常用正则表达式
只能输入数字:"^[0-9]*$"。
只能输入n位的数字:"^\d{n}$"。
只能输入至少n位的数字:"^\d{n,}$"。
只能输入m~n位的数字:。"^\d{m,n}$"
只能输入零和非零开头的数字:"^0|[1-9][0-9]*$"。
只能输入有两位小数的正实数:"^[0-9]+(\.[0-9]{2})?$"。
只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?$"。
只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
只能输入非零的负整数:"^\-[1-9][0-9]*$"。
只能输入长度为3的字符:"^.{3}$"。
只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。
验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。 
 

 

 

分享到:
评论

相关推荐

    UE使用技巧(宏、正则表达式)

    处理字符时,少不了UE(UltraEidt)的帮忙,只有在处理中才发现其功能之强悍。在此,共享个人积累,抛砖引玉,希望对大家有用。

    小巧强悍的工具Convert:正则表达式测试/代码转换/翻译/编解码/加解密

    1、Regular Expression Tester:正则表达式测试/生成; 2、C#<->VB.Net Converter:C#与VB.Net的相互转换; 3、Google Translator:调用Google语言内核,世界和语种的互译; 4、Encoding<->Decoding:编码和解码,...

    匹配日期的正则表达式

    强悍的日期正则表达式 匹配年月日,匹配年月日加时间,匹配从某一年开始。

    Perl正则表达式讲解

    正则表达式的匹配功能确实强悍,那么在Perl中是如何使用的呢?本文档基于Perl环境对正则表达式进行讲解,使初看起来很唬人的正则表达式变得清晰(全文为txt格式)。

    .Net用来验证所有正则表达式的类 强悍

    .Net用来验证所有正则表达式的类 强悍

    net正则表达式测试工具

    net正则表达式测试工具,相当的强悍的。处理字符串必备工具。

    正则表达式

    正则表达式,好强悍的东西,你不会不喜欢吧??

    功能超级强悍的文本编辑器 PilotEdit 14.3.0 + x64 中文多语免费版.zip

    文本编辑器,支持文本编辑,比较,FTP编辑,FTP上传下载,加密,十六进制编辑,列模式,回行显示,正则表达式,多行查找和替换,代码折叠,关键字高亮显示,编辑400GB的大文件,比较100GB的大文件,对超过1G的大文件...

    MYDataGridView超级扩展控件源码和使用实例demo

    9.扩展DataGridViewMaskedTextBox(正则表达式列,可设置任意正则表达式) 10.扩展DataGridViewTreeView(下拉树功能,有点小毛病,懒得改,呵呵) 11.MYDataGridView(呵呵,调用的时候直接调用这个控件就可以了,...

    强悍的Web资料集合

    XMLDOM DOM DHTML HTML XML 正则表达式 XSL XmlHttp WEB开发人员参考大全 AJAX CSS DIV+CSS CSS JAVAScript 基本上罗列Web开发的很多资,里面的XmlDOM、DOM、DHTML、CSS、XmlHttp、AJXA、以及XSL和Xpath重要资料……

    ReNamer(文件重命名) v6.8.0.0.zip

    软件小巧但功能强悍该程序支持包括插入、删除、移除、替换、前缀、后缀以及正则表达式等十四种重命名规则,可以实现文件改前缀、改后缀、替换、大小写转换、删除符号、添加数字序号、删除数字、字符等多种形式。...

    Flexible Renamerv 8.3

    文件改名工具,支持正则表达式,功能相当强悍,使用非常简单,无需注册。

    巨好用的文件批量重命名工具

    巨好用的文件批量重命名工具 功能介绍: 正则表达式 一键替换 一键编号 自动填补日期 前缀定义 后缀定义 拓展名定义 动态变量定义 等强悍功能

    检测一个函数是否是JavaScript原生函数的小技巧

    在我的开发工作中经常会遇到需要判断一个函数是否是JavaScript原生函数的情况,有时候这是一个很必要的...toString方法会返回这个方法的字符串形式,然后用正则表达式判断里面包含的字符。 更强悍的方法 Lodash的创始

    MFEXECOM论坛开源

    不要采用 eval(), 正则表达式 e 修饰符 3. 不要采用 autoload 4. 不要采用 $$var 多重变量 5. 不要使用 PHP 高级特性 __call __set __get 等魔术方法 6. 尽量采用函数封装功能,通过前缀区分模块。 【mfexeUI...

Global site tag (gtag.js) - Google Analytics