首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【转】java正则表达式施用-验证字符串是否为数字

2013-08-14 
【转】java正则表达式应用--验证字符串是否为数字非捕获组 ????? 以 (?) 开头的组是纯的非捕获 组,它不捕获

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


非捕获组

????? 以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。就是说,如果小括号中以?号开头,那么这个分组就不会捕获文本,当然也不会有组的编号,因此也不存在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代码片段如下:

/** *  */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();}}

?

?

?

?

热点排行