在一篇正則表達式技術文檔中看到下面內容:
“外需要說明的一點是,除(Expression)和(?name>Expression)語法外,其它的(?...)語法都不是捕獲組。”
這個內容是好理解的,但疑惑的是,該文章作者在另一篇相關正則的技術文章中,其中一個這樣的實例,著實讓我迷惑了一番:
文本內容
正則表達式
(?is)td>(?:(?!/td>).)*/td>
注意上面正則表達式的代碼,他對“(?!/td>).”進行“強制非捕獲組”,我在短信中告訴他,可以這樣寫:(?is)td>((?!/td>).)*/td>
兩天仍未見他回復,于是在回過頭來研究一下他代碼,起初我將重點放在“(?!/td>)”這個括號算不算捕獲組。但是在看一次上面技術文章的代碼我才反應過來。他不是針對(?!/td>)強制為非捕獲組,而是將(?!/td>).強制為非捕獲組,于是我就做了下面的測試:
文本內容
正則表達式
td>((?!/td>).)*/td>td>(\1)*/td>
匹配結果
這就證明,如果不對“(?!/td>).”進行強制為非捕獲組,它是會捕獲的,而這個捕獲,我根本不需要它。
下面,我在測試一下,除了(Expression)和(?name>Expression)語法外,其它的,如環視,它算不算捕獲組。
文本內容
正則表達式
td>((?!/td>).)*/td>td>(\2.)*/td>
匹配結果:不匹配
如有不同見解,歡迎討論。