程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java正則表達式不支持命名捕獲組的解決

Java正則表達式不支持命名捕獲組的解決

編輯:關於JAVA
   目前Java的正則表達式不支持命名捕獲組功能,只能通過捕獲組的計數來訪問捕獲組。當正則表達式比較復雜的時候,裡面含有大量的捕獲組和非捕獲組,通過從左至右數括號來得知捕獲組的計數也是一件很煩人的事情;而且這樣做代碼的可讀性也不好,當正則表達式需要修改的時候也會改變裡面捕獲組的計數。

    解決這個問題的方法是通過給捕獲組命名來解決,就像Python, PHP, .Net 以及Perl這些語言裡的正則表達式一樣。這個特性Javaer已經期待了很多年,而現在我們終於在JDK7 b50得到了實現。

    新引入的命名捕獲組支持如下:

 

(1) (?X) to define a named group NAME"

(2) \k to backref a named group "NAME"

(3) <$ to reference to captured group in matcher's replacement str

(4) group(String NAME) to return the captured input subsequence by the given "named group"

現在你可以像這樣使用正則式:

1 String pStr = "0x(?\\p{XDigit}{1,4})\\s++u\\+(?\\p{XDigit}{4})(?:\\s++)?";
2
3 Matcher m = Pattern.compile(pStr).matcher(INPUTTEXT);
4
5 if (m.matches()) {
6
7 int bs = Integer.valueOf(m.group("bytes"), 16);
8
9 int c = Integer.valueOf(m.group("char"), 16);
10
11 System.out.printf("[%x] -> [%04x]%n", bs, c);
12
13 }
14
15 String pStr = "0x(?\\p{XDigit}{1,4})\\s++u\\+(?\\p{XDigit}{4})(?:\\s++)?";
16
17 Matcher m = Pattern.compile(pStr).matcher(INPUTTEXT);
18
19 if (m.matches()) {
20
21 int bs = Integer.valueOf(m.group("bytes"), 16);
22
23 int c = Integer.valueOf(m.group("char"), 16);
24
25 System.out.printf("[%x] -> [%04x]%n", bs, c);
26
27 }

或者

1 System.out.println("0x1234 u+5678".replaceFirst(pStr, "u+$ 0x___FCKpd___2quot;));

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved