原文:https://blog.csdn.net/woaigaolaoshi/article/details/50970527
Pattern用法
Java正則表達式通過java.util.regex包下的Pattern和Matcher類實現
Pattern類用於創建一個正則表達式,也可以說是創建一個匹配模式,可以通過兩個靜態方法創建:compile(String regex)和compile(String regex,int flags),其中regex是正則表達式,flags為可選模式(如:Pattern.CASE_INSENSITIVE 忽略大小寫)
實例:
Pattern pattern = Pattern.compile("Java");
// 返回此模式的正則表達式即Java
System.out.println(pattern.pattern());
Pattern類還有兩個根據匹配模式拆分輸入序列的方法:split(CharSequence input) 和split(CharSequence input, int limit),其中limit為返回元素的個數。
實例:
Pattern pattern = Pattern.compile("Java");
String test="123Java456Java789Java";
String[] result = pattern.split(test);
for(String s : result)
System.out.println(s);
結果:
123
456
789
再細說一下split(CharSequence input, int limit),當limit值大於所能返回的字符串的最多個數或者為負數,返回的字符串個數將不受限制,但結尾可能包含空串,而當limit=0時與split(CharSequence input)等價,但結尾的空串會被丟棄。
Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java";
String[] result = pattern.split(test,2);
for(String s : result)
System.out.println(s);
result = pattern.split(test,10);
System.out.println(result.length);
result = pattern.split(test,-2);
System.out.println(result.length);
result = pattern.split(test,0);
System.out.println(result.length);
運行結果:
123
456Java789Java
4
4
3
這邊再給出一個JDK源代碼中的列子:
The input "boo:and:foo", for example, yields the following results with these parameters:
Regex | Limit | Result |
---|---|---|
: | 2 | { "boo", "and:foo" } |
: | 5 | { "boo", "and", "foo" } |
: | -2 | { "boo", "and", "foo" } |
o | 5 | { "b", "", ":and:f", "", "" } |
o | -2 | { "b", "", ":and:f", "", "" } |
o | 0 | { "b", "", ":and:f" } |
Pattern類也自帶一個靜態匹配方法matches(String regex, CharSequence input),但只能進行全字符串匹配並且只能返回是否匹配上的boolean值
實例:
String test1 = "Java";
String test2 = "Java123456";
System.out.println(Pattern.matches("Java",test1));//返回true
System.out.println(Pattern.matches("Java",test2));//返回false
Matcher類用法
最后就要過渡到Matcher類了,Pattern類中的matcher(CharSequence input)會返回一個Matcher對象。
Matcher類提供了對正則表達式的分組支持,以及對正則表達式的多次匹配支持,要想得到更豐富的正則匹配操作,那就需要將Pattern與Matcher聯合使用。
實例:
Pattern pattern = Pattern.compile("Java");
String test = "123Java456Java789Java";
Matcher matcher = pattern.matcher();
Matcher類提供了三個返回boolean值得匹配方法:matches(),lookingAt(),find(),find(int start),其中matches()用於全字符串匹配,lookingAt從字符串最開頭開始匹配滿足的子串,find可以對任意位置字符串匹配,其中start為起始查找索引值。
實例
Pattern pattern = Pattern.compile("Java");
String test1 = "Java";
String test2 = "Java1234";
String test3 = "1234Java"
// match方法需要整個字符串都匹配正則才返回true
// 返回true
Matcher matcher = pattern.matcher(test1);
System.out.println(matcher.matches());
// 返回false
matcher = pattern.matcher(test2);
System.out.println(matcher.matches());
// lookingAt需要字符串是以正則模式開頭,才返回true
// 返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.lookingAt());
// 返回false
matcher = pattern.matcher(test3);
System.out.println(matcher.lookingAt());
//從相應的下標開始匹配,只要有匹配到的就返回true
//返回true
matcher = pattern.matcher(test1);
System.out.println(matcher.find());
//返回true
matcher = pattern.matcher(test2);
System.out.println(matcher.find());
matcher = pattern.matcher(test3);
//返回true
System.out.println(matcher.find(2));
matcher = pattern.matcher(test3);
//返回false
System.out.println(matcher.find(5));
這里介紹下組的概念:組是用括號划分的正則表達式,可以根據組的編號來引用這個組。組號為0表示整個表達式,組號為1表示被第一對括號括起的組,依次類推,例如A(B(C))D,組0是ABCD,組1是BC,組2是C。
但是類似於(?:pattern)格式的子表達式不能算是一個分組。
通過(?
java)這種形式可以給分組命名,其中<>中就是分組的名稱
Matcher類提供了start(),end(),group()分別用於返回字符串的起始索引,結束索引,以及匹配到到的字符串。
實例:
Pattern pattern = Pattern.compile("(java)");
Matcher matcher = pattern.matcher("12java自由java之路");
int groupCount = matcher.groupCount();
System.out.println(groupCount);
groupCount = matcher.groupCount();
System.out.println(groupCount);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
String group = matcher.group();
System.out.println("start:end:group-->" + start + ":" + end + ":" + group);
}
Matcher類提供了start(int gropu),end(int group),group(int i),groupCount()用於分組操作
實例:
Pattern pattern1 = Pattern.compile("(?<p1>java)(python)");
Matcher matcher1 = pattern1.matcher("java自由java之路javapython自由之路python");
// 輸出false,因為要滿足整個字符串匹配正則才輸出true
System.out.println(matcher1.matches());
// 輸出false,因為要滿足字符串以正則模式開頭才輸出true
System.out.println(matcher1.lookingAt());
// 輸出分組數量:2
// 加上默認分組其實有三個分組:javapython、java、python
int count = matcher1.groupCount();
System.out.println("分組數量:" + count);
while (matcher1.find()) {
System.out.println("find str...");
for (int i = 0; i <= count; i++) {
int start = matcher1.start(i);
int end = matcher1.end(i);
String group = matcher1.group(i);
System.out.println("start:end:group-->" + start + ":" + end + ":" + group);
}
// 通過分組名稱來獲取分組的值
System.out.println("xxx-->"+matcher1.group("p1"));
}
Matcher類還提供region(int start, int end)(不包括end)方法用於設定查找范圍,並提供regionStrat()和regionEnd()用於返回起始和結束查找的索引。
這個方法和find方法類似,但是比find方法更強大。
find方法只能制定開始下標。但是region可以指定一個范圍。
Pattern pattern = Pattern.compile("Java");
String test = "123JavaJava";
Matcher matcher = pattern.matcher(test);
matcher.region(7, 11);
// 返回7
System.out.println(matcher.regionStart());
// 返回11
System.out.println(matcher.regionEnd());
matcher.find();
//返回 Java
System.out.println(matcher.group());
Matcher類提供了兩種用於重置當前匹配器的方法:reset()和reset(CharSequence input)
Pattern pattern = Pattern.compile("Java");
String test = "Java";
Matcher matcher = pattern.matcher(test);
matcher.find();
//返回Java
System.out.println(matcher.group());
//從起始位置重新匹配
matcher.reset();
matcher.find();
//返回Java
System.out.println(matcher.group());
//返回false
//相當於matcher = pattern.matcher("Python");
matcher.reset("Python");
System.out.println(matcher.find());
最后說一下Matcher類的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替換全部匹配到的字符串,而replaceFirst僅僅是替換第一個匹配到的字符串。
Pattern pattern = Pattern.compile("Java");
String test = "JavaJava";
Matcher matcher = pattern.matcher(test);
//返回PythonPython
System.out.println(matcher.replaceAll("Python"));
//返回PythonJava
System.out.println(matcher.replaceFirst("python"));
還有兩個方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允許直接將匹配的字符串保存在另一個StringBuffer中並且是漸進式匹配,並不是只匹配依次或匹配全部,而appendTail則是將未匹配到的余下的字符串添加到StringBuffer中。
Pattern pattern = Pattern.compile("Java");
Matcher matcher = pattern.matcher("Java1234");
//返回true
System.out.println(matcher.find());
StringBuffer sb = new StringBuffer();
matcher.appendReplacement(sb, "Python");
//輸出Python
System.out.println(sb);
matcher.appendTail(sb);
//輸出Python1234
System.out.println(sb);
總結
暫時就記錄這么多,需要的時候再總結。