标签:连接 world 包含 i++ div split case 有一个 UI
字符串对象
使用正则表达式最简单的办法,就是直接调用字符串对象的方法。
System.out.println("1234".matches("\\d+")); // true
String str = "Hello world 47"; String[] arr = str.split(" "); System.out.println(Arrays.toString(arr)); // [Hello, world, 47] arr = str.split(" ", 2); System.out.println(Arrays.toString(arr)); // [Hello, world 47]
replaceFirst、replaceAll : 替换第一个、全部匹配上指定正则表达式的子串
String str = "Hello world 47"; System.out.println(str.replaceFirst("\\d", "*")); // Hello world *7 System.out.println(str.replaceAll("\\d", "*")); // Hello world **
Pattern和Matcher对象的创建
由于String类的功能有限,所以我们经常需要构建功能强大的正则表达式对象。通过Pattern.compile()方法来根据传入的String类型的正则表达式生成Pattern对象,然后把需要检索的字符串传入Pattern类的matcher方法生成Matcher对象,Matcher中提供了大量的方法满足我们的需求。Matcher对象的创建过程如下
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("123456");
其中Pattern还提供了一个重载的compile方法,第二个参数为标记参数(可以传入多个用"|"连接),这些标记都是Pattern类中的常量。如下
以上标记参数后面的括号内的字符若直接插入在正则表达中,将拥有与传入标记参数一样的效果。如下所示
Pattern p = Pattern.compile("^java", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); //Pattern p = Pattern.compile("(?i)(?m)^java"); Matcher m = p.matcher("java is good\nJAVA is best"); while (m.find()) System.out.print(m.group() + " "); // java JAVA
上面代码中用到Matcher对象的find与group方法将在下面进行讲解。可以看出以上两种创建Pattern对象的方式,将不会影响最后的输出结果。而且由于传入了标记参数所以可以无视大小写成功匹配JAVA并且字符串中含有换行符所以匹配到了两个结果
Matcher对象的方法以及使用
String s = "Hello world, my name is ghaien.\n" + "this is a demo from a book.\n" + "it‘s named thinking in java."; Matcher m = Pattern.compile("(?m)((\\S+)\\s+(\\S+))$").matcher(s); while (m.find()) { for (int i = 0; i < m.groupCount(); i++) System.out.print("[" + m.group(i) + "]"); System.out.println(); }/* output [is ghaien.][is ghaien.][is] [a book.][a book.][a] [in java.][in java.][in] */
String s = "Hello world 47"; Matcher m = Pattern.compile("[a-zA-Z]").matcher(s); System.out.println(m.replaceFirst("*")); m = Pattern.compile("[a-zA-Z]").matcher(s); System.out.println(m.replaceAll("*")); m = Pattern.compile("[a-zA-Z]").matcher(s); StringBuffer sb = new StringBuffer(); int i = 0; while (m.find()) m.appendReplacement(sb, i++ + ""); System.out.println(sb); m.appendTail(sb); System.out.println(sb); /* output *ello world 47 ***** ***** 47 01234 56789 01234 56789 47 */
从上面的代码中可以看出replaceFirst与replaceAll只能将一个或所有匹配的替换成某个指定的字符串,这有时候并不能满足我们的需求,而appendReplacement方法的替换是渐进式的并且每次都能替换成我们所需要的,从后面来两个输出的结果也能够很直接的看出appendTail方法的作用
标签:连接 world 包含 i++ div split case 有一个 UI
原文地址:http://www.cnblogs.com/guohaien/p/7251142.html