JAVA的正則真的比JS和PYTHON要復(fù)雜很多,或者說(shuō)叫做精細(xì)吧。有兩個(gè)Matcher的API不常用静秆,但是我在《兩周自制腳本語(yǔ)言》上面看見了。
先說(shuō)說(shuō)useAnchoringBounds吧巡李,它的默認(rèn)值就是false抚笔。是在Matcher 的region 不等于被匹配字符串的長(zhǎng)度才有用的。
先看看下面的代碼
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lexer {
public static void main(String[] args){
String regex="^car";
String text = "Madagascar";
Matcher m = Pattern.compile(regex).matcher(text);
m.useAnchoringBounds(false);
m.region(7,text.length());
m.find();
System.out.println("Matches starting at character "+m.start());
}
}
/**
* 輸出結(jié)果
* Exception in thread "main" java.lang.IllegalStateException: No match available
* at java.util.regex.Matcher.start(Matcher.java:343)
* at entry.Lexer.main(Lexer.java:18)
* */
直接就是一個(gè)報(bào)錯(cuò)侨拦。因?yàn)槲覀兊淖址皇且?strong>car為開頭的殊橙。
但是,接下來(lái)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lexer {
public static void main(String[] args){
String regex="^car";
String text = "Madagascar acfun acfun";
Matcher m = Pattern.compile(regex).matcher(text);
m.useAnchoringBounds(true);
m.region(7,text.length());
m.find();
System.out.println("Matches starting at character "+m.start());
/**
* 輸出結(jié)果
* Matches starting at character 7
* */
}
}
就可以了狱从,為什么呢膨蛮。因?yàn)槲覀兊膔egion是從第七個(gè)字符開始的也就是car acfun acfun useAnchoringBounds(true); 那么匹配的就變成了 region的開頭了,而不是整一個(gè)字符串的開頭季研。
然后是第二個(gè)敞葛。useTransparentBounds(),它的默認(rèn)值是false。它的作用如下与涡。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Lexer {
public static void main(String[] args){
String regex="\\bcar\\b";
String text = "Madagascar acfun acfun";
Matcher m = Pattern.compile(regex).matcher(text);
m.useTransparentBounds(false);
m.region(7,text.length());
m.find();
System.out.println("Matches starting at character "+m.start());
//輸出結(jié)果
//Matches starting at character 7
}
}
和上次一樣region依然是car acfun acfun惹谐,但是\b卻好像被忽視了一樣,對(duì)了递沪,這就是它的作用豺鼻,允許忽視一個(gè)類似\b的東西。
如果 useTransparentBounds 被設(shè)為true 那么結(jié)果是相反的款慨,它會(huì)報(bào)錯(cuò)儒飒。