强悍的正则表达式

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

     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"。 
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值