JDK7 正則表示式 捕獲組命名
jdk6之前的正則表示式不支援命名捕獲組功能,只能通過捕獲組的索引來訪問捕獲組。當正則表示式比較複雜的時候,裡面含有大量的捕獲組和非捕獲組,通過從左至右數括號來得知捕獲組的計數也是一件很煩人的事情;而且這樣做程式碼的可讀性也不好,當正則表示式需要修改的時候也會改變裡面捕獲組的計數。
解決這個問題的方法是通過給捕獲組命名來解決,就像Python, PHP, .Net 以及Perl這些語言裡的正則表示式一樣.
新引入的命名捕獲組支援如下:
(1) (?<NAME>X) to define a named group "NAME"
(2) \k<Name> to backref a named group "NAME"
(3) ${NAME} 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"
例子如下:
public static void indexedCaptureTest(){//jdk6之前的使用方式
String names = "fred or barney" ;
Matcher m = Pattern.compile("(\\w+) or (\\w+)").matcher(names);
if(m.find()){
System.out.println(m.group(1)+","+m.group(2));
}
}
public static void namedCaptureTest(){//jdk7可以給捕獲組命名
String names = "fred or barney";
Matcher m = Pattern.compile("(?<name1>\\w+) or (?<name2>\\w+)" ).matcher(names);
if(m.find()){
System.out.println(m.group("name1")+","+m.group("name2"));
}
}
再看一下反向引用和替換字串的例子:
String input = “aabbbccdddef”;
如何把這個字串拆成[aa, bbb, cc, ddd, e, f]這樣的陣列?
public static void indexedCaptureReplace(){
String input = "aabbbccdddef";
String regex = "((.)+?)(?!\\2)";
String temp = input.replaceAll(regex, "$1,");
String[] arr = temp.split(",");
System.out.println(java.util.Arrays.toString(arr));
}
public static void namedCaptureReplace(){
String input = "aabbbccdddef";
String regex = "(?<name2>(?<name1>.)+?)(?!\\k<name1>)";//好醜陋的實現!ugly!
String temp = input.replaceAll(regex, "${name2},");
String[] arr = temp.split(",");
System.out.println(java.util.Arrays.toString(arr));
}
相關推薦
JDK7 正則表示式 捕獲組命名
jdk6之前的正則表示式不支援命名捕獲組功能,只能通過捕獲組的索引來訪問捕獲組。當正則表示式比較複雜的時候,裡面含有大量的捕獲組和非捕獲組,通過從左至右數括號來得知捕獲組的計數也是一件很煩人的事情;而且這樣做程式碼的可讀性也不好,當正則表示式需要修改的時候也會改
正則表示式——捕獲組和反向引用
正則表示式的捕獲組和反向引用: 使用小括號指定一個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其他程式中作進一步處理。預設情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標誌,第一個出現的分組的組號為1,第二
java正則表示式捕獲組
Java中使用正則表示式返回符合正則表示式的字串就要用到group(),group中記錄了所有符合指定表示式的字串。本文通過一段程式碼講解如何使用group()。<span style="whi
正則表示式----平衡組、捕獲組、非捕獲組
正則表示式----平衡組 請參考http://xuedong.iteye.com/blog/1117195正則表示式----捕獲組 請參考http://blog.csdn.net/lxcnn/article/details/4146148正則表示式----非捕獲組 請參考ht
python3實現正則表示式平衡組
最近遇到一個需求,要獲得一個網頁上一個div裡所有的內容。理所當然的使用正則表示式,但是python是不支援正則平衡組的。所以只能自己寫程式碼實現了。程式碼如下: import re ''' 堆疊方式,迴圈查詢標籤名稱 ''' def loopTab(t
關於正則表示式——捕獲型括號和非捕獲型括號
對於括號中的子表示式,正則表示式會將匹配的子表示式進行儲存。 <pre class="javascript" name="code">var regular = /^Subject:(\d)/ var str = "Subject:1 as something"
Django的路由系統|URL配置、正則表示式、分組命名、名稱空間、命名URL反向解析
1,主要內容 1. 檢視(接收請求返回響應那部分) 1. CBV(class base view)和FBV(function base view) 2. request物件 1. 之前學過的 1. request.method
提取最外層配對標籤,放棄正則表示式-平衡組
public List<string> 提取最外層配對標籤(string 字串) { List<string> html標籤 = new List<string>(); //===========
正則表示式 平衡組/遞迴匹配
平衡組用於匹配巢狀層次結構,常用於匹配HTML標籤(當HTML內容不規範,起始標籤和結束標籤數量不同時,匹配出正確配對的標籤),在此把表示式統一以\w為例。 (?'group'\w) 捕獲的分組(\w匹配到的內容)命名為group,並壓入堆疊(?'-group'\w) 捕獲
csdn—正則表示式當中的捕獲組
捕獲組 捕獲組是把多個字元當成一個單獨的單元進行處理的方法。 這個方法是通過對括號裡面的字元進行分組來進行建立的。 打個比方來說,正則表示式(dog)建立了單一分組,組裡面是包含了”d”,”o”,”g”這三個東西的。 那麼捕獲組是什麼意思呢,就是通過從左到右計算它的開括號
java 正則表示式 非捕獲組(特殊構造
在 java api 文件中的正則表示式關於特殊構造(非捕獲組)的說明看不懂。例如:(?:X) X,作為非捕獲組 (?idmsux-idmsux) Nothing,但是將匹配標誌由 on 轉為 off (?idmsux-idmsux:X) X,作為帶有給定標誌 on - off 的非捕獲組 (?=X
正則表示式之分組捕獲、條件表示式、平衡組
其實我是想說平衡組,但我並是想寫一篇給零基礎的朋友們閱讀,我希望你是對正則有所瞭解,對平衡組不太瞭解的朋友閱讀。如果已經瞭解,看看也無妨。多一點思路。 分組捕獲 - () 就是用括號把要匹配的內容擴起來 命名分組捕獲 - (?<name>)或(?'
正則表示式的非捕獲組
ref: http://www.cnblogs.com/graphics/archive/2010/06/02/1749707.html http://www.cnblogs.com/yakun/p/3795589.html 原文符號 因為?在正則表示式中有特殊的含
java正則表示式 非捕獲組詳解
這幾天看了下正則表示式,對非捕獲組(non-capturing)進行下總結。 主要總結 1個 + 2組 一共5個。 (?:X) (?=X) (?<=X) (?!X) (?<!X) 一、先從(?:)非捕獲組說起。 下面由一個例子引出非捕獲組。 有兩個金額:889
正則表示式如何匹配一個單詞存在一次或零次並且不佔捕獲組位置
正則表示式如何匹配一個單詞存在一次或零次並且不佔捕獲組位置 今天要用正則表示式實現匹配一個詞出現一次或者不出現的情況,但是又不
正則表示式——POSIX字元組
前面介紹了常用的字元組,但是在某些文件中,你可能會發現類似[:digit:]、[:lower:]之類的字元組,看起來不難理解(digit就是"數字",lower就是"小寫"),但又很奇怪,它們就是POSIX字元組(POSIX Character Class)。因為某些語言的文件中出現了這些字元組,為避免困惑,
正則表示式——普通字元組
字元組表示“在同一個位置可能出現的各種字元”, 其寫法是在一對方括號 [ 和 ] 之間列出所有可能出現的字元。 例 1 - 1 判斷數字字元的虛擬碼 charStr == "0" || charStr == "1" ··· || charStr == "9" 這種解法的問題在與太過於煩瑣 例 1 -
Linux使用者組和許可權管理及正則表示式
1、複製/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部檔案的屬組和其他使用者沒有任何訪問許可權。 [[email protected] ~]# cp -a /etc/skel /home/tuser1 [[email protected] ~]#
正則表示式——命名分組
語言 分組記法 表示式中的引用記法 替換時的引用的記法 .NET (?<name>...) \k<name> ${name} PHP (?P<name&
正則表示式——非捕獲分組
目前為止,總共介紹了括號的三種用途: 分組,將相關的語速歸攏到一起,構成單個元素;多選結構,規定可能出現的多個子表達示;引用分組,將子表示式匹配的文字儲存起來,供之後引用。 這三種用途並不是彼此獨立的,而是互相重疊的: 單純的分組可以視為“只包含一個多選分支的多選結構”;整個多選結構也會被視為單個元