`
gongmingwind
  • 浏览: 578830 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java正则表达式应用--验证字符串是否为数字

    博客分类:
  • web
阅读更多
首先说一下java正则表达式的重点概念:
第一、相关类:Pattern、Matcher
第二、典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches 方法。此方法编译表达式并在单个调用中将输入序列与其匹配。
语句 boolean b = Pattern.matches("a*b", "aaaaab");等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
此类的实例是不可变的,可供多个并发线程安全使用。Matcher 类的实例用于此目的则不安全。

第三、正则表达式的构造摘要
字符类
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[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](减去)

说明:
[]表示范围--某一个字符的范围
^表示非
&&表示

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
说明:预定义字符类和字符类部分可以互换。如:[0-9] == \d

数量词
X? :X出现一次或一次也没有
X* :X出现零次或多次
X+ :X出现一次或多次
X{n} :X出现恰好 n 次
X{n,} :X出现至少 n 次
X{n,m} :X出现至少 n 次,但是不超过 m 次
例子:a?bc 表示在一个字符串中a出现0次或1次,abc或bc都可以匹配,aabc不可匹配

捕获组和非捕获组

组的表示方法:
捕获组

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

1     ((A)(B(C)))
2     \A
3     (B(C))
4     (C)

组零始终代表整个表达式

之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器检索。


Back 引用 是说在后面的表达式中我们可以使用组的编号来引用前面的表达式所捕获到的文本序列(是文本不是正则)。



例如 ([" ']).* \1   其中使用了分组,\1就是对引号这个分组的引用,它匹配包含在两个引号或者两个单引号中的所有字符串,如,"abc" 或 " ' " 或 ' " '  ,但是请注意,它并不会对" a'或者 'a"匹配。原因上面已经说明,Back引用只是引用文本而不是表达式。


非捕获组

      以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在Back 引用。

在Java中,支持的非捕获组,有如下几种:

(?=X)     X,通过零宽度的正 lookahead 即左侧匹配
(?!X)     X,通过零宽度的负 lookahead 即左侧匹配
(?<=X)     X,通过零宽度的正 lookbehind 即右侧匹配
(?<!X)     X,通过零宽度的负 lookbehind 即右侧匹配
 



这四个非捕获组用于匹配表达式X,但是不包含表达式的文本。

(?=X )
零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,\w+(?=\d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。
(?!X)
零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,\w+(?!\d) 与后不跟数字的单词匹配,而不与该数字匹配。
(?<=X)
零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。
(?<!X)
零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配

说明:
非捕获组中四个表达式的区别:
(?=X ) 和(?!X)用于右侧匹配
(?<=X)和(?<!X)用于左侧匹配



举例:

上面都是理论性的介绍,这里就使用一些例子来说明一下问题:

   1、测试匹配性   (abc)+def(?<!4)56(?=9) 这里的含义就是匹配 以一个或多个abc开头后跟def的文本,而且后面的文本56前面不能是4,后面必须是9组成。因此,可以匹配如下文本 abcdef5569  ,与abcdef4569不匹配。



  2 、提取字符串   提取 da12bka3434bdca4343bdca234bm   提取包含在字符a和b之间的数字,但是这个a之前的字符不能是c,b后面的字符必须是d才能提取。
        例如这里就只有3434这个数字满足要求。那么我们怎么提取呢?

       首先我们写出提取这个字符串的表达式: (?<!c)a(\d+)bd  这里就只有一个捕获组(\d+)

JAVA代码片段如下:
 Pattern p = Pattern.compile("(?<!c)a(\\d+)bd"); 
 Matcher m = p.matcher("da12bca3434bdca4343bdca234bm"); 
 while(m.find()){ 
   System.out.println(m.group(1)); //我们只要捕获组1的数字即可。结果 3434 
   System.out.println(m.group(0)); // 0组是整个表达式,看这里,并没有提炼出(?<!c)的字符 。结果 a3434bd 
 }


可以看到,非捕获组,最后是不会返回结果的,因为它本身并不捕获文本。






/**
 * 
 */
package cn.com.kn.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 功能说明: 2009-1-13 上午10:27:44
 * 
 * @author gmw
 * 
 */

public class PatternTest {
	
	public void testParttern(){
                  //表达式的功能:验证必须为数字(整数或小数)
		String pattern = "[0-9]+(.[0-9]+)?";
		//对()的用法总结:将()中的表达式作为一个整体进行处理,必须满足他的整体结构才可以。
		//(.[0-9]+)? :表示()中的整体出现一次或一次也不出现
		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher("2");
		boolean b = m.matches();
		if(b){
			System.out.println("istrue:"+b);
		}
		
	}
	

	public static void main(String[] args) {
		PatternTest pt = new PatternTest();
//		pt.testFormat("2");
		pt.testParttern();
		
		
	}
}

分享到:
评论
1 楼 somefuture 2009-10-03  
讲的真好,谢谢

相关推荐

    Java正则表达式.ppt

    正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的...

    java代码验证日期格式正则表达式(包含闰年验证)带注释

    * @param 日期验证,验证的格式有: * "yyyyMM","yyyyMMdd","yyyyMMdd HH:mm:ss", * "yyyy-MM","yyyy-MM-dd","yyyy-MM-dd HH:mm:ss" * "yyyy.MM","yyyy.MM.dd","yyyy.MM.dd HH:mm:ss" * "yyyy/MM","yyyy/MM/dd...

    java 正则表达式

    JAVA正则表达式语法(转)正则表达式语法正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式示例表达式 ...

    java script 正则表达式验证大全

    正则表达式验证 java script 验证大全 部分: 下面都是我收集的一些比较常用的正则表达式,因为平常可能在表单验证的时候,用到的比较多。特发出来,让各位朋友共同使用。呵呵。 匹配中文字符的正则表达式: [u4...

    Java正则表达式验证固定电话号码符合性

    主要介绍了Java正则表达式验证固定电话号码符合性的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    Java-PHP正则表达式的使用

    匹配中文字符的正则表达式: [u4e00-u9fa5]  评注:匹配中文还真是个头疼的事,有了这个表达式就好办了  匹配双字节字符(包括汉字在内):[^x00-xff]  评注:可以用来计算字符串的长度(一个双字节字符长度计2...

    所有常用的正则表达式

    评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:(S*?)[^&gt;]*&gt;.*?|*? /&gt; 评注:网上流传的版本太...

    常用正则表达式******

    评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:\n\s*\r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:&lt;(\S*?)[^&gt;]*&gt;.*?|*? /&gt; 评注:网上流传的版本太...

    正则表达式数字验证

    //java正则表达式数字验证 public boolean isNumber(String str) { java.util.regex.Pattern pattern=java.util.regex.Pattern.compile("[0-9]+(.[0-9]+)?"); java.util.regex.Matcher match=pattern.matcher...

    Java正则表达式-详解(附相关真题)

    目录正则表达式1. 正则标记1.1 字符1.2 字符类1.3 预定义字符类1.4 边界匹配器(java一般不用到)1.5 Greedy 数量词1.6 Logical ...概述:描述了一种字符串匹配的模式,用来检查一个串是否含有某个子串、将匹配的子串替

    Java正则表达式 验证手机号码是否合法并脱敏的完整实例

    本案例我们介绍使用Java代码的正则表达式来验证手机号码其是否合法。 具体编写步骤: 1、封装一个工具类 2、验证手机号码的代码方法编写 3、如果验证通过,对该手机号码脱敏处理,并输出到控制台打印出来。

    正则表达式

    当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配 的部分.例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/.但是...

    精通正则表达式~~~

    作为正则表达式的字符串... 101 字符编码... 105 正则模式和匹配模式... 110 常用的元字符和特性... 113 字符表示法... 115 字符组及相关结构... 118 锚点及其他“零长度断言” 129 注释和模式量词... 135 ...

    正则表达式 不包含特定单词 字符串

    项目中输入框需要验证不能输入root或者admin,不区分大小写。 琢磨了很久,写出来了正则如下: /^(?!root|admin)|\broot.+|\badmin.+/i tips:如果是写在java里,\b前面需要加转义符,写成\\b 如果你觉得有用,...

    使用正则表达式验证数据或提取数据

    * 类简介: 使用正则表达式验证数据或提取数据,类中的方法全为静态的 * 主要方法:1. isHardRegexpValidate(String source, String regexp) 区分大小写敏感的正规表达式批配 * 2. isSoftRegexpValidate(String ...

    python-17-正则表达式.zip

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这 些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一 种过滤逻辑(可以用来做检索,截取或者替换...

    C# 最全的日期正则表达式,没有之一

    对于验证,如果仅仅是验证字符组成及格式是没有多大意义的,还要加入对规则的校验。由于闰年的存在,使得日期的校验正则变得比较复杂。 先来考察一下日期的有效范围以及什么是闰年。 2 日期的规则 2.1 日期的有效...

    用正则表达式来验证身份证,电话号码,学号,邮箱

    绝对正确的源代码!建立一个熟悉语言环境的类文件(javascript、Java、C#),用于各种输入字符串的科学性验证,要求:包含姓名、学号、身份证号、手机号、电子邮箱

    java使用正则表达式判断邮箱格式是否正确的方法

    主要介绍了java使用正则表达式判断邮箱格式是否正确的方法,涉及java正则表达式及字符串的相关操作技巧,需要的朋友可以参考下

    正则表达式经典实例

    3.6 检查正则表达式能否整个匹配目标字符串 3.7 获取匹配文本 3.8 决定匹配的位置和长度 3.9 获取匹配文本的一部分 3.10 获取所有匹配的列表 3.11 遍历所有匹配 3.12 在过程代码中对匹配结果进行验证 3.13 在...

Global site tag (gtag.js) - Google Analytics