Java正则表达式
以下所写的内容在菜鸟教程中可以找到。如果有需要可以去看看。
正则表达式定义了字符串模式,可以用来搜索,编辑或处理文本;它不仅限于某一种语言,但是在每一种语言中有细微的差别。
java.util.regex包主要包括以下三个类:
1.Pattern类:pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个pattern对象,你必须首先调用公共静态编译方法,
它返回一个Pattern对象。改方法接受一个正则表达式作为它的第一个参数。
2.Matcher: Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher
方法来获得一个Matcher对象。
3.PatternSyntaxException:PatternSyntaxException是一个非强制的异常类,它表示一个正则模式中的语法错误。
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。
下面的例子说明如何从一个给定的字符串中找到数字串:
public class RegexMatcher { public static void main(String[] args) { String line = "my name is Wangwei 300 cat."; String REGEX = "(\\D*)(\\d+)(.*)"; Pattern pattern = Pattern.compile(REGEX); Matcher m = pattern.matcher(line); if(m.find()){ System.out.println("找到值为:"+m.group(0)); System.out.println("找到值为:"+m.group(1)); System.out.println("找到值为:"+m.group(2)); }else{ System.out.println("没有找到。。。"); } } }
以上实例编译运行结果如下:
找到值为:my name is Wangwei 300 cat.
找到值为:my name is Wangwei
找到值为:300
Matcher类的方法:
一.索引方法:
1.public int start()
返回以前匹配的初始索引。
2.public int start(int group)
返回在以前的匹配操作期间,由给定所捕获的子序列的初始索引。
3.public int end()
返回最后匹配字符之后的偏移量
4.public int end(int group)
返回在以前的匹配操作期间,有给定组所捕获子序列的最后字符之后的偏移量。
二.研究方法:研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式。
1.public boolean lookingAt()
尝试将从区域开头开始的输入序列与该模式匹配。
2.public boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
3.public boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式,从指定索引开始的输入序列的下一个子序列。
4.public boolean matches()
尝试将整个区域与模式匹配
三.替换方法
1.public Matcher appendReplacement(StringBuffer sb,String replacement)
实现非终端添加和替换步骤。
2.public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤.
3.public String replaceAll(String replacement)
替换模式与给定替换字符串相匹配的输入序列的每个子序列
4.public static String quoteReplacement(String s)
返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递Matcher类的appendReplacement方法一个字面字符串一样工作。
start和end方法:
public class PatternMain { public static void main(String[] args) { final String REGEX = "cat"; final String INPUT = " cat cat cat cat "; Pattern pattern = Pattern.compile(REGEX); Matcher m = pattern.matcher(INPUT); int count = 0; while(m.find()){ count++; System.out.println("match number"+count); System.out.println("start():"+m.start()); System.out.println("end():"+m.end()); } } }
编译运行结果如下:
match number1 start():1 end():4 match number2 start():5 end():8 match number3 start():9 end():12 match number4 start():13 end():16
可以看到这个例子是使用单词边界,以确保字符"c","a","t"并非仅是一个较长的词的子串。它也提供了一些关于输入字符串中匹配发生位置的有用信息。
Start方法返回在以前的匹配造作期间,有给定组所捕获的子序列的初始索引,end方法最后一个匹配字符的索引加1.
matches和lookingAt方法
matches和lookingAt方法都用来尝试一个输入序列模式。它们的不同是matcher要求整个序列都匹配,而lookingAt不要求。这两个方法经常在输入字符串的开始使用。
我们通过下面这个例子,来解释这个功能:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; 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("Current REGEX is: "+REGEX); System.out.println("Current INPUT is: "+INPUT); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); } }
以上实例编译运行结果如下:
Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false
replaceFirst 和 replaceAll 方法
replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。
下面的例子来解释这个功能:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow. " + "All dogs say meow."; private static String REPLACE = "cat"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // get a matcher object Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } }
以上实例编译运行结果如下:
The cat says meow. All cats say meow.
appendReplacement 和 appendTail 方法
Matcher 类也提供了appendReplacement 和 appendTail 方法用于文本替换:
看下面的例子来解释这个功能:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoob"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); // 获取 matcher 对象 Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()){ m.appendReplacement(sb,REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } }
以上实例编译运行结果如下:
-foo-foo-foo-
PatternSyntaxException 类的方法
PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。
PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。
1.public String getDescription()
获取错误的描述
2.public int getIndex()
获取错误的索引
3.public String getPattern()
获取错误的正则表达式模式
4.public String getMseeage()
返回多行字符串,包含语法错误及其索引的描述,错误的正则表达式模式和模式中错误索引的可视化指示。