在JDK7 b50中將實(shí)現(xiàn)正則表達(dá)式命名捕獲組
在JDK7 b50中將實(shí)現(xiàn)正則表達(dá)式命名捕獲組是眾望所歸,目前Java的正則表達(dá)式不支持命名捕獲組功能,只能通過捕獲組的計(jì)數(shù)來(lái)訪問捕獲組。當(dāng)正則表達(dá)式比較復(fù)雜的時(shí)候,里面含有大量的捕獲組和非捕獲組,通過從左至右數(shù)括號(hào)來(lái)得知捕獲組的計(jì)數(shù)也是一件很煩人的事情;而且這樣做代碼的可讀性也不好,當(dāng)正則表達(dá)式需要修改的時(shí)候也會(huì)改變里面捕獲組的計(jì)數(shù)。
解決這個(gè)問題的方法是通過給捕獲組命名來(lái)解決,就像Python, PHP, .Net 以及Perl這些語(yǔ)言里的正則表達(dá)式一樣。這個(gè)特性javaer已經(jīng)期待了很多年,而現(xiàn)在我們終于在jdk7 b50得到了實(shí)現(xiàn)。
新引入的命名捕獲組支持如下:
◆(?X) to define a named group NAME"
◆\k to backref a named group "NAME"
◆<$ to reference to captured group in matcher's replacement str
◆group(String NAME) to return the captured input subsequence by the given "named group"
在JDK7 b50中實(shí)現(xiàn)正則表達(dá)式命名捕獲組之后你可以像這樣使用正則式:
- String pStr = "0x(?\\p{XDigit}{1,4})\\s++u\\+(?\\p{XDigit}{4})(?:\\s++)?";
- Matcher m = Pattern.compile(pStr).matcher(INPUTTEXT);
- if (m.matches()) {
- int bs = Integer.valueOf(m.group("bytes"), 16);
- int c = Integer.valueOf(m.group("char"), 16);
- System.out.printf("[%x] -> [%04x]%n", bs, c);
- }
- String pStr = "0x(?\\p{XDigit}{1,4})\\s++u\\+(?\\p{XDigit}{4})(?:\\s++)?";
- Matcher m = Pattern.compile(pStr).matcher(INPUTTEXT);
- if (m.matches()) {
- int bs = Integer.valueOf(m.group("bytes"), 16);
- int c = Integer.valueOf(m.group("char"), 16);
- System.out.printf("[%x] -> [%04x]%n", bs, c);
- }
或者
- System.out.println("0x1234 u+5678".replaceFirst(pStr, "u+$ 0x$"));
在JDK7 b50中實(shí)現(xiàn)正則表達(dá)式命名捕獲組之后怎么樣呢?是不是眼睛一亮呢?
【編輯推薦】