//java正则表达式 //正则表达式定义了字符串的模式。 //正则表达式可以用来搜索、编辑或处理文本。 //正则表达式并不仅限于一种语言,但是每种语言有细微的差别。 //正则表达式实例 //正则表达式实例 //java.util.regex包主要包括以下三个类: //Pattern类: //Pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,你必须首先调用公共静态编译方法。 //他返回一个Pattern对象。该方法接受一个正则表达式作为他的第一个参数。 //Matcher类: //Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,matcher也没有公公构造方法。 //你需要调用Pattern对象的matcher方法来获得一个Matcher对象。 //PatternSyntaxException: //PatternSyntaxException是一个非情之宜常磊,他表示一个正则表达式模式中的语法错误。 //一下示例中使用了正则表达式.*runoob.*用于查找字符串中是否包含了runoob子串: //示例 class RegexExample{ public static void main( String[] args ){ String content = "I am pratice from runoob.com"; String regex = ".*runoob.*"; boolean isMatch = Pattern.matches( regex, content ); System.out.println( "字符串是否包含了“runoob”" + isMatch ); } } //捕获组 //捕获组是把多个字符当一个单独单元进行处理的方法,他通过对括号的字符分组来创建。 //捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组: //((A)(B(C))) //(A) //(B(C)) //(C) //可以通过调用matcher对象的groupCount方法来查看表达式有多少个分组。groupCount方法返回一个int值,表达matcher对象当前有多少个捕获组。 //还有一个特殊的组(group(0)),他总是代表整个表达式。改组不哭哦在groupCount的返回值中。 //下面的例子说明如何从一个给定的字符串中找到数字串: class RegMatches{ public static void main( String[] args ){ //按指定模式在字符串中查找 String input = "this order was placed for QT3000! OK? "; String regex = "(\\D*)(\\d+)(.*)"; //创建Pattern对象 Pattern p = Pattern.compile( regex ); //创建matcher对象 Matcher m = p.matcher( input ); if( m.find() ){ System.out.println( "Found value:" + m.group(0) ); System.out.println( "Found value:" + m.group(1) ); System.out.println( "Found value:" + m.group(2) ); System.out.println( "Found value:" + m.group(3) ); }else{ System.out.println( "no matcher" ); } } } //Matcher类的方法 //start和end方法 //下面是一个对单词“cat”出现在输入字符串总出现的次数进行计数的例子: class RegMatch{ private static final String regex = "\\bcat\\b"; private static final String input = "cat cat cat cattie cat"; public static void main( String[] args ){ //创建Pettern对象 Pattern p = Pattern.compile(regex); //创建Matcher对象 Matcher m = p.matcher(input); int count = 0; if( m.find()){ count++; System.out.print(" Match number" + count ); System.out.print( "start()" + m.start() ); System.out.println( "end()" + m.end() ); } } } //matches和lookingAt方法 //mathces和lookingAt方法都用来尝试匹配一个输入序列模式。他们的不同是matcher要求整个序列都匹配,而lookingAt不要求。 //这两个方法经常在输入字符串的开始使用。 //示例 class RegMatcher{ private static final String regex = "foo"; private static final String input = "fooooooooo"; private static Pattern pattern; private static Matcher matcher; public static void main( String[] args ){ pattern = Pattern.compile(regex); matcher = pattern.matcher(input); System.out.println( "lookingAt()" + matcher.lookingAt() ); System.out.println( "matches()" + matcher.matches() ); } } //lookingAt(): true //matches():false //replaceFirst 和 replaceAll方法 //replaceFirst和replaceAll方法用来替换匹配正则表达式的文本。不同的是,replaceFirst替换首次匹配,replaceAll替换所有匹配。 //示例 class RegMatche{ private static String regex = "dog"; private static String input = "the dog says wawa, all dogs say wawa"; private static String replace = "cat"; private static Pattern p; private static Matcher m; public static void main( String[] args ){ p = Pattern.compile( regex ); m = p.matcher( input ); input = m.replaceAll( replace ); System.out.println( input ); } } //appendReplacement和appendTal方法 //Matcher类也提供了appendTail方法用于文本替换 class RegMatchAppend{ private static String regex = "a*b"; private static String input = "aabfooaabfooabfoob"; private static String replacement = "-"; private static Pattern p; private static Matcher m; public static void main( String[] args ){ p = Pattern.compile(regex); m = p.matcher(input); StringBuffer sb = new StringBuffer(); if( m.find() ){ m.appendReplacement(sb, replacement); } m.appendTail(sb); System.out.println( sb.toString() ); } } //PatternSyntaxException类的方法 //PatternSyntaxException是一个非强制性异常类,他指示一个正则表达式模式中的语法错误。 //PatternSyntaxException类提供了下面的方法来帮助我们查看发生了什么错误。 //public String getDesctiption() //获取错误的描述 //public int getIndex() //获取错误的索引 //public String getPattern() //获取错误的正则表达式模式 //public String getMessage() //返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示