1. package book.string.regex;  
  2.  
  3. import java.util.regex.Matcher;  
  4. import java.util.regex.Pattern;  
  5.  
  6. /**  
  7.  * jdk1.4中加入了java.util.regex包提供对正则表达式的支持。  
  8.  * 而且Java.lang.String类中的replaceAll和split函数也是调用的正则表达式来实现的。  
  9.  */ 
  10. public class RegexExpression {  
  11.  
  12.     /**  
  13.      * 利用正则表达式查找匹配字符串  
  14.      */ 
  15.     public static void testFind() {  
  16.         // ^符号匹配字符串的开头  
  17.         // 匹配以abc开头的字符串  
  18.         RegexExpression.find("abcdef""^abc");  
  19.         RegexExpression.find("Aabc def""^abc");  
  20.         System.out.println();  
  21.  
  22.         // $符号匹配字符串的结尾  
  23.         // 匹配以def结尾的字符串  
  24.         RegexExpression.find("Aabcdef""def$");  
  25.         RegexExpression.find("AabcdeF""def$");  
  26.         // 如果同时使用^符号和$符号,将进行精确匹配  
  27.         RegexExpression.find("def""^def$");  
  28.         RegexExpression.find("abcdefg""^def$");  
  29.         System.out.println();  
  30.  
  31.         // *符号匹配0个或多个前面的字符  
  32.         RegexExpression.find("a""ab*");  
  33.         RegexExpression.find("ab""ab*");  
  34.         RegexExpression.find("abbb""ab*");  
  35.         System.out.println();  
  36.  
  37.         // +符号匹配至少一个前面的字符  
  38.         RegexExpression.find("a""ab+");  
  39.         RegexExpression.find("ab""ab+");  
  40.         RegexExpression.find("abbb""ab+");  
  41.         System.out.println();  
  42.  
  43.         // ?符号匹配0个或1个前面的字符  
  44.         RegexExpression.find("a""ab?c?");  
  45.         RegexExpression.find("ab""ab?c?");  
  46.         RegexExpression.find("abc""ab?c?");  
  47.         RegexExpression.find("abbcb""ab?c?");  
  48.         System.out.println();  
  49.  
  50.         // .符号匹配除换行符以外的任何字符,  
  51.         RegexExpression.find("a"".");  
  52.         // .与+连用能匹配除换行符以外的所有字符串  
  53.         RegexExpression.find("dasf4566a`1345=-=4bsd"".+");  
  54.         System.out.println();  
  55.  
  56.         // x|y匹配"x"或"y"  
  57.         // abc|xyz 可匹配 "abc"或 "xyz",而"ab(c|x)yz"匹配 "abcyz"和"abxyz"  
  58.         RegexExpression.find("x""x|y");  
  59.         RegexExpression.find("y""x|y");  
  60.         RegexExpression.find("abc""abc|xyz");  
  61.         RegexExpression.find("xyz""abc|xyz");  
  62.         RegexExpression.find("abc""ab(c|x)yz");  
  63.         RegexExpression.find("abcyz""ab(c|x)yz");  
  64.         System.out.println();  
  65.  
  66.         // {n}匹配恰好n次(n为非负整数)前面的字符  
  67.         RegexExpression.find("aa""a{3}");  
  68.         RegexExpression.find("aaa""a{3}");  
  69.         System.out.println();  
  70.  
  71.         // {n,}匹配至少n次(n为非负整数)前面的字符  
  72.         RegexExpression.find("aaa""a{3,}");  
  73.         RegexExpression.find("aaaaa""a{3,}");  
  74.         System.out.println();  
  75.  
  76.         // {m,n}匹配至少m个,至多n个前面的字符  
  77.         RegexExpression.find("aaa""a{3,4}");  
  78.         RegexExpression.find("aaaa""a{3,4}");  
  79.         RegexExpression.find("aaaaa""a{3,4}");  
  80.         System.out.println();  
  81.  
  82.         // [xyz]表示一个字符集,匹配括号中字符的其中之一  
  83.         RegexExpression.find("a""[abc]");  
  84.         RegexExpression.find("b""[abc]");  
  85.         RegexExpression.find("c""[abc]");  
  86.         RegexExpression.find("ab""[abc]");  
  87.         System.out.println();  
  88.  
  89.         // [^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符  
  90.         RegexExpression.find("a""[^abc]");  
  91.         RegexExpression.find("x""[^abc]");  
  92.         RegexExpression.find("8""[^abc]");  
  93.         System.out.println();  
  94.  
  95.         // [a-z]匹配从"a"到"z"之间的任何一个小写字母字符  
  96.         RegexExpression.find("c""[b-d]");  
  97.         RegexExpression.find("f""[b-d]");  
  98.         RegexExpression.find("$""[b-d]");  
  99.         System.out.println();  
  100.  
  101.         // [^a-z]表示某个范围之外的字符,匹配不在指定范围内的字符  
  102.         RegexExpression.find("f""[b-d]");  
  103.         RegexExpression.find("b""[b-d]");  
  104.         System.out.println();  
  105.  
  106.         // [a-zA-Z] a到z或A到Z  
  107.         RegexExpression.find("B""[a-cA-F]");  
  108.         RegexExpression.find("G""[a-cA-F]");  
  109.         System.out.println();  
  110.  
  111.         // [a-z-[bc]] a到z,除了b和c  
  112.         RegexExpression.find("c""[a-z-[bcd]]");  
  113.         RegexExpression.find("e""[a-z-[bcd]]");  
  114.         RegexExpression.find("f""[a-z-[e-x]]");  
  115.         System.out.println();  
  116.  
  117.         // 特殊字符,\n换行符;\f分页符;\r回车;\t制表符  
  118.         RegexExpression.find("\n""\n");  
  119.         RegexExpression.find("\f""\f");  
  120.         RegexExpression.find("\r""\r");  
  121.         RegexExpression.find("\t""\t");  
  122.         System.out.println();  
  123.  
  124.         // \\表示转义符\,在使用时要用\\\\代表\\,\\代表\。  
  125.         RegexExpression.find("\\", "\\\\");  
  126.         System.out.println();  
  127.  
  128.         // \s 任何白字符,包括空格、制表符、分页符等。等价于"[\f\n\r\t]"  
  129.         // 使用\s时前面再加一个\  
  130.         RegexExpression.find("\n""\\s");  
  131.         RegexExpression.find("\f""\\s");  
  132.         RegexExpression.find("\r""\\s");  
  133.         RegexExpression.find("\t""\\s");  
  134.         System.out.println();  
  135.  
  136.         // \S 任何非空白的字符。等价于"[^\f\n\r\t]"  
  137.         // 使用\s时前面再加一个\  
  138.         RegexExpression.find("\n""\\S");  
  139.         RegexExpression.find("\f""\\S");  
  140.         RegexExpression.find("a""\\S");  
  141.         RegexExpression.find("9""\\S");  
  142.         System.out.println();  
  143.  
  144.         // \w 任何单词字符,包括字母和下划线。等价于"[A-Za-z0-9_]"  
  145.         // 使用时用\\w  
  146.         RegexExpression.find("a""\\w");  
  147.         RegexExpression.find("9""\\w");  
  148.         RegexExpression.find("X""\\w");  
  149.         RegexExpression.find("_""\\w");  
  150.         System.out.println();  
  151.  
  152.         // \W 任何非单词字符。等价于"[^A-Za-z0-9_]"  
  153.         // 使用时用\\W  
  154.         RegexExpression.find("a""\\W");  
  155.         RegexExpression.find("9""\\W");  
  156.         RegexExpression.find("$""\\W");  
  157.         RegexExpression.find("#""\\W");  
  158.         System.out.println();  
  159.  
  160.         // \d匹配一个数字字符,等价于[0-9]  
  161.         RegexExpression.find("6""\\d");  
  162.         RegexExpression.find("9""\\d");  
  163.         RegexExpression.find("A""\\d");  
  164.         System.out.println();  
  165.  
  166.         // \D匹配一个非数字字符,等价于[^0-9]  
  167.         RegexExpression.find("%""\\D");  
  168.         RegexExpression.find("$""\\D");  
  169.         RegexExpression.find("A""\\D");  
  170.         RegexExpression.find("8""\\D");  
  171.         System.out.println();  
  172.  
  173.         // \b匹配单词的结尾  
  174.         RegexExpression.find("love""ve\\b");  
  175.         RegexExpression.find("very""ve\\b");  
  176.         System.out.println();  
  177.  
  178.         // \B匹配单词的开头  
  179.         RegexExpression.find("love""ve\\B");  
  180.         RegexExpression.find("very""ve\\B");  
  181.         System.out.println();  
  182.     }  
  183.     /**  
  184.      * 利用正则表达式查找匹配字符串。  
  185.      * @param str   待匹配的字符串  
  186.      * @param regex 正则表达式  
  187.      * @return  
  188.      */ 
  189.     public static boolean find(String str, String regex) {  
  190.         // 将正则表达式编译成一个Pattern  
  191.         Pattern p = Pattern.compile(regex);  
  192.         // 创建一个Matcher  
  193.         Matcher m = p.matcher(str);  
  194.         // Matcher的find方法用来查找或者匹配,只要能找到满足正则表达式的子串,就返回true  
  195.         boolean b = m.find();  
  196.         System.out.println("\"" + str + "\" 匹配正则表达式 \"" + regex + "\" ?  " + b);  
  197.         return b;  
  198.     }  
  199.     /**  
  200.      * 测试利用正则表达式 精确匹配 字符串  
  201.      */ 
  202.     public static void testMatch() {  
  203.         RegexExpression.match("abcdef""^abc");  
  204.         RegexExpression.match("Aabc def""^abc");  
  205.         RegexExpression.match("Aabcdef""def$");  
  206.         RegexExpression.match("AabcdeF""def$");  
  207.         RegexExpression.match("def""^def$");  
  208.     }  
  209.     /**  
  210.      * 精确匹配字符串和正则表达式,所谓精确匹配是字符串的每个字符都满足正则表达式  
  211.      * @param str  
  212.      * @param regex  
  213.      * @return  
  214.      */ 
  215.     public static boolean match(String str, String regex) {  
  216.         // 将正则表达式编译成一个Pattern  
  217.         Pattern p = Pattern.compile(regex);  
  218.         // 创建一个Matcher  
  219.         Matcher m = p.matcher(str);  
  220.         boolean b = m.matches();// 精确匹配  
  221.         System.out.println("\"" + str + "\" 精确匹配正则表达式 \"" + regex + "\" ?  " 
  222.                 + b);  
  223.         return b;  
  224.     }  
  225.     /**  
  226.      * 测试利用正则表达式替换字符串  
  227.      */ 
  228.     public static void testReplace() {  
  229.         // 将字符串中重复的空格替换为一个空格  
  230.         RegexExpression.replace("a  a    a   a"" {2,}"" ");  
  231.         RegexExpression.replace("abcad a""a""x");  
  232.     }  
  233.     /**  
  234.      * 利用正则表达式替换字符串  
  235.      * @param str    待替换的字符串  
  236.      * @param regex  正则表达式  
  237.      * @param newStr 用来替换的字符串  
  238.      * @return  
  239.      */ 
  240.     public static String replace(String str, String regex, String newStr) {  
  241.         Pattern p = Pattern.compile(regex);  
  242.         Matcher m = p.matcher(str);  
  243.         // 用新串替换所有满足正则表达式的子串  
  244.         String s = m.replaceAll(newStr);  
  245.         System.out.println("\"" + str + "\" 中匹配正则表达式 \"" + regex + "\" 部分被 \"" 
  246.                 + newStr + "\" 替换后: " + s);  
  247.         return s;  
  248.     }  
  249.     /**  
  250.      * 利用正则表达式分割字符串  
  251.      */ 
  252.     public static void testSplit() {  
  253.         // 按空格分割字符串,空格符可以是连续的多个。  
  254.         System.out.println("RegexExpression.split(\"ab  aba a    bbc bc\", \" +\", 5): result");  
  255.         RegexExpression.outputStrArray(RegexExpression.split(  
  256.                 "ab  aba a    bbc bc"" +"5));  
  257.         // 按照字母b分割字符串  
  258.         System.out  
  259.                 .println("RegexExpression.split(\"ab  aba a    bbc bc\", \"b\", 5): result");  
  260.         RegexExpression.outputStrArray(RegexExpression.split(  
  261.                 "ab  aba a    bbc bc""b"5));  
  262.     }  
  263.     /**  
  264.      * 使用正则表达式分割字符串  
  265.      * @param str   待分割的字符串  
  266.      * @param regex 正则表达式  
  267.      * @param count 最终被分成的段数的最大值  
  268.      * @return  
  269.      */ 
  270.     public static String[] split(String str, String regex, int count) {  
  271.         Pattern p = Pattern.compile(regex);  
  272.         // 按照符合正则表达式的子串分割字符串  
  273.         return p.split(str, count);  
  274.     }  
  275.     /**  
  276.      * 输出字符串数组  
  277.      * @param array  
  278.      */ 
  279.     public static void outputStrArray(String[] array) {  
  280.         if (array != null) {  
  281.             for (int i = 0; i < array.length; i++) {  
  282.                 System.out.println(i + ": " + array[i]);  
  283.             }  
  284.         }  
  285.     }  
  286.     public static void main(String[] args) {  
  287.         RegexExpression.testFind();  
  288.         RegexExpression.testMatch();  
  289.         System.out.println();  
  290.         RegexExpression.testReplace();  
  291.         System.out.println();  
  292.         RegexExpression.testSplit();  
  293.         System.out.println();  
  294.         // 查找并替换, 替换换前2个满足正则表达式的子串  
  295.         Pattern p = Pattern.compile("a+");  
  296.         Matcher m = p.matcher("bba bb aaa bbabb bab");  
  297.         StringBuffer sb = new StringBuffer();  
  298.         int i = 0;  
  299.         while ((m.find()) && (i < 2)) {  
  300.             // 将字符串中的匹配的部分替换,  
  301.             // 并且两次匹配之间(包括被匹配的部分)的字符串追加到sb后  
  302.             m.appendReplacement(sb, "XX");  
  303.             i++;  
  304.         }  
  305.         // 将字符串中没有进行匹配的部分全部追加到sb后面  
  306.         m.appendTail(sb);  
  307.         System.out.println(sb.toString());  
  308.     }  
  309.     /**  
  310.      * 在程序中使用正则表达式的步骤一般如下: 1. 建立Pattern对象,通过静态方法Pattern.compile(); 2.  
  311.      * 取得Matcher对象,通过pattern.matcher(CharSequence charSequence); 3.  
  312.      * 调用Matcher对象的相关查找方法。  
  313.      * java.lang.CharSequence接口是在JDK1.4版本中被添加进来的,它为不同种类的char序列  
  314.      * 提供了统一的只读访问。实现的类有String, StringBuffer, java.nio.CharBuffer  
  315.      * Matcher提供几个不同的查找方法,比String类的matches()方法更灵活,如下:  
  316.      * match() 使用整个字符串与相关模式相比较,和String的matches()差不多  
  317.      * lookingAt() 从字符串开头的地方与相关模式比较  
  318.      * find() 匹配字符串,没有必要从字符串的第一个字符开始,如果前一个操作匹配, 而且匹配器没有重置的话,则从不匹配的第一个字符开始。  
  319.      * 上面每个方法都返回boolean类型,返回true则意味的匹配,返回false则不匹配。  
  320.      * 要检测给定的String是否匹配给定的模式,只须下面这样就可以了:  
  321.      * Matcher m = Pattern.compile(yourPattern).matcher(yourString);  
  322.      * if (m.find()) { System.out.println(“match”); } else {  
  323.      * System.out.println(“no match”); }  
  324.      */