java数字正则表达式-java 注释 正则表达式
正则表达式在处理文本时非常有用。 这种机制首先在 Perl 和 awk 语言中提供。 Java也在Java 2中加入了正则表达式包java.util.regex,这个包为用户使用正则表达式提供了简单易用和全面的支持。 我的研究方向是网络挖掘。 从网页中提取内容和处理文本,当然需要正则表达式这个强大的工具。 1. 首先,让我们看一个如何使用正则表达式的示例:匹配器检查应用模式的结果。 我们希望从这句话中找出所有以a开头的单词。 当然,这只是一个简单的例子。 可以使用String提供的split方法得到一个单词数组,然后遍历每个单词看是否以a开头。 现在让我们看看如何使用正则表达式来处理这个问题:
Java 代码 importjava.util.regex.*;publicclassFindA{publicstaticvoidmain(Stringargs[])throwsException{Stringcandidate="AMatcherexaminestheresultsofapplyingapattern.";Stringregex="\\ba\\w*\\b";Patternp=Pattern.compile(regex) ;Matcherm=p.matcher(candidate);Stringval=null;System.out.println("INPUT:"+candidate);System.out.println("REGEX:"+regex+"\r\n");while( m.find()){val=m.group();System.out.println("MATCH:"+val);}if(val==null){System.out.println("NOMATCHES:"); }}} 从这个例子中我们可以看出正则表达式涉及到的Matcher和Pattern这两个类,以后再讨论这两个类。
现在主要看使用正则表达式的过程:首先使用Pattern的一个静态方法compile创建一个Pattern对象,Java代码Patternp=Pattern.compile(regex); 然后调用Pattern的方法matcherJava代码Matcherm=p.matcher(candidate); 获取Matcher对象,Matcher对象保存了很多匹配信息,然后可以使用find()方法找到匹配的部分java数字正则表达式,如果有匹配的部分,返回true,使用m.group方法获取匹配值,否则查找返回false。 当然,这只是一个大概的过程,还有很多更详细的方法,以后再总结。 我们来看看Java代码 Stringregex="\\ba\\w*\\b"; 这是一个正则表达式java数字正则表达式,b、w、*是正则表达式的原始元字符,\b代表一个词的边界,w代表任何可以组成一个词的字母数字,*代表前面的字母(当然也可以是更复杂的组等)重复0次或多次,a当然是a。 所以这个正则表达式匹配以 a 开头的单词。 二、下面总结了基本正则表达式的元字符及其含义: . 匹配任意字符 $ 匹配行尾 ^ 匹配行首([]中表示取反) {} 定义一个范围 [] 定义一个字符类()定义一个组 * 前面0次+以上一场比赛在前面? 0次或前面1次 \ 后面的字符不会被视为元字符 \w 字母数字下划线 \W 非字母数字下划线\d 单个数字 \D 单个非数字 | 或者,&& AND 运算符 \b 单词边界 下面是几个简单的示例: [abc] a、b 或 c(简单类) [^abc] 除 a、b 或 c 之外的任何字符(负数)[a-zA- Z] a 到 z 或 A 到 Z,包括(范围)[ad[mp]] a 到 d 或 m 到 p:[a-dm -p](并集)[az&&[def]] d、e 或 f(交集)[az&&[^bc]] a 到 z 除了 b 和 c:[ad-z](减去)[az&&[^ mp]] a 到 z,而不是 m 到 p:[a-lq-z](减去) 3. java.util.regex提供的操作接口: java.util.regex包提供了一个操作正则表达式的模型,整个模型优雅简洁,只有三个类:Pattern、Matcher和PatternSyntaxException。
下面将总结它们提供的方法以及如何灵活地应用于处理文本。 让我们从 Pattern 的静态工厂方法展开:Java 代码 staticPatterncompile(Stringregex) 将给定的正则表达式编译成模式并创建一个 Pattern 对象。 此方法通常是操作正则表达式的第一步。 从前面我们也可以看到那个例子中的整个过程。 看一下重载的编译方法:Java 代码 staticPatterncompile(Stringregex, intflags) 将给定的正则表达式编译成具有给定标志的模式。 该方法的参数flags提供了一些特殊的选项,用于特殊处理。 我们来看看可用的选项: UNIX_LINES:这个主要是处理UNIX和其他操作系统行尾不同的问题。 UNIX用\n表示行尾,Windows用\r\n、\n、\r、\u2028或\u0085作为行尾。 CASE_INSENSITIVE:当我们想在匹配时忽略字符大小写时 COMMENTS:允许我们在正则表达式中使用注释,例如Java代码Patternp=Pattern.compile("A#matchesuppercaseUS-ASCIIcharcode65",Pattern.COMMENTS); MULTILINE:表示要输入多行,它们有自己的终止符。
Java代码Patternp=Pattern.compile("^",Pattern.MULTILINE); 如果你输入的字符串是: This is a sentence.\n So is this.. 这样我们匹配到的字符是T和So in This In S,如果不使用MULTILINE,只会匹配TDOTALL:使用this之后选项,元字符。 . 使用这个选项会降低Java代码的效率 Patternp=Pattern.compile(".",Pattern.DOTALL); 如果我们输入Test\n,则匹配字符为5。 UNICODE_CASE:处理UNICODE字符集,使用该选项会降低效率 CANON_EQ:一个字符的实际存储形式是编码后的数字。 使用 CANON_EQ 选项可以匹配各种编码的字母。 比如a可以匹配+00E0和U+0061U+0300。 使用此选项会降低效率。 我们可以结合上面的选项,只需要使用|,来执行按位或操作Java代码我们还需要注意Java对翻译字符\的处理,比如我们要匹配一个数字:不能使用:Java代码Patternp=Pattern.compile("\d"); 相反:Java 代码 Patternp=Pattern.compile("\\d"); 另外,如果regex本身的形式不对,compile方法会抛出java.util.regex.PatternSyntaxException异常。
总结一下public Matcher匹配器(CharSequence输入)方法: 当我们使用compile操作创建一个Pattern对象时,我们可以使用Pattern对象的matcher操作来生成一个matcher对象。 Matcher 对象包含多对匹配结果集。 操作,我们在总结Matcher对象的时候再说。 另外,顺便说一句,参数CharSequence、CharBuffer、Segment、String、StringBuffer、StringBuilder都实现了这个接口,所以参数可以是这几种类型中的任意一种。 下面我们看一下: Java代码 publicintflags() 这个方法返回我们可以设置的和已经设置好的flags选项。 我们使用按位与来确定是否设置了选项:Java 代码 intflgs=myPattern.flags(); booleanisUsingCommentFlag=(Pattern.COMMENTS==(Pattern.COMMENTS&flgs)); 看一个简化流程的方法: Java代码 publicstaticbooleanmatches(Stringregex,CharSequenceinput) 这个方法其实就是: Java代码 Patternp=Pattern.compile(regex);Matcherm= p.matcher(candidate); m.matches()是流程的简化,后面总结Matcher中的matches方法就会明白这一点。
想必我们经常会用到String中的split方法,将字符串中的token提取到字符串数组中。 我们来看一个类似的方法: public String[] split(CharSequence input) 这个方法提供了强大的功能,因为它可以使用正则表达式作为标记拆分: Java代码 Patternp=newPattern.compile(",|and");Stringfruits []=p.split("苹果、香蕉和橘子"); split的重载版本:Java代码publicString[]split(CharSequenceinput,intlimit)指定了分组的个数,分三种情况:limit==0,没有limit参数的split效果和limit一样>0 如果只限制第一个Interested,可以使用limit:Java代码String[]tmp=pattern.split("Hello,Dolly,You,Are,My,Favorite",3);//tmp[0]is "Hello",//tmp[1]是"Dolly";//tmp[2]是"You,Are,My,Favorite"; limitPatternp=Pattern.compile(",");Stringtemp[]=p.split("Hello,Dolly," ,-1);//temp[]={"Hello","Dolly",""} 下一次,我将总结Matcher类和正则表达式的一些高级部分。 相关资源:Java正则表达式图片版