国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Regex > 正文

巧解 JavaScript 中的嵌套替換(強大正則)

2020-03-16 21:09:55
字體:
來源:轉載
供稿:網友
如何僅使用JavaScript支持的正則語法,將有嵌套的內容替換
 
 
網友wys提問:如何僅使用JavaScript支持的正則語法,將 

復制代碼代碼如下:

<p> 
<table> <p> <p> </table> 
<table> <p> <p> </table> 
<p> 

中<table>...</table>之間的<p>都替換為<br/>? 
思考 
該問題的難點之一在于JavaScript支持的正則特性實在有限。樓主已經想到了非JavaScript的解法,如下: 
復制代碼代碼如下:

re=/(?<=<table.*?)(<p>)(?=.*?<//table>)/gi; 
alert (sourcestr.replace(re,"<br>")); 

嗯,思路大致是這樣。較真起來,即使JavaScript支持逆序環視,上面答案并不能夠如愿運行。原因是帶有量詞的逆序環視(即在(?<=)里面使用?, *, +, {}這樣的量詞)是更高級的的語法,極少有語言能夠支持(特例是.Net)。 

但是,像樓主這樣的正則問題應該是很普便的一個問題,我們經常需要循環地替換一些內容。該如何解答呢? 

思路一 

閱讀JavaScript的文檔,我找到了lastIndex這樣的東東。根據這個東東,我形成了這樣的思路:
•先按外層循環,找到第一組較大的匹配。正則代碼是<table[^>]*>[/s/S]*?<//table> 
•定位到這次匹配結束的起始位置,替換掉這一段字串中所有的<p>。 
•循環執行。 
我覺得上述思路大致清晰,但是細節太多(每次匹配涉及3個位置點,一個長度),解起來并非從容不迫,最終的代碼想必也不會賞心悅目;尤為重要的是,整個思路像是原始的 Crack,而不是高手的 Hack 。而且思路與正則關系不大。我決定換一條路。 

思路二 

關鍵是循環和嵌套。還好不是盜夢空間的深層遞歸。能否將匹配的內容保護起來,替換完之后再放回原位呢? 

想到這里,就豁然開朗了。 

思路:先找到所有的匹配內容,記路在數組inner中; 

同時使用該正則,將原字串split為另一個數組wrapper; 

一個重要的特點是,wrapper一定比inner多一個元素,它一一將inner項隔開,并處于最外層。wrapper 和 inner 的關系,就像是一個手掌的5根指頭與4個指縫的關系。將中間的元素取出,記下位置,等處理完之后,再將所有的元素粘合在一起。就是這樣簡單。代碼如下(為了讓問題更有普使性,我稍改了一下源字串): 

復制代碼代碼如下:

<script type="text/javascript"> 
var str="<p> <table> <p> ,<p> </table> <p> <table> <p> <p> </table> <p> <table> <p> <p> </table>"; 

var patt=/<table[^>]*>[/s/S]*?<//table>/i; 
var wrapper_result=str.split(patt); 
var inner_result = str.match(/<table[^>]*>[/s/S]*?<//table>/ig); 

var len=inner_result.length; 
var final=wrapper_result[0]; 

for (i=0; i<len; i++) 

tmp=inner_result[i].replace(/<p>/gi,"<br>"); 
final+=tmp+wrapper_result[i+1]; 

alert(final); 
</script> 

貼圖: 
巧解 JavaScript 中的嵌套替換(強大正則)

更新 

果然是能人輩出,評論更精彩!請看評論中的這則代碼: 
復制代碼代碼如下:
alert(sourcestr.replace(/<table.*?//table>/ig, function($1){return $1.replace(/<p>/ig,"<br>")}));

PS: 本站剛剛添加了評論中代碼的解析,可以貼代碼了。格式見評論部分的圖例顯示。謝謝合作!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石屏县| 建瓯市| 永城市| 博乐市| 遂川县| 柞水县| 翁牛特旗| 泰安市| 江山市| 和龙市| 武城县| 新绛县| 田东县| 余江县| 岳普湖县| 湘潭县| 清原| 乌拉特后旗| 资阳市| 佛学| 建平县| 灌南县| 平度市| 永登县| 中牟县| 思茅市| 尉犁县| 开阳县| 道孚县| 胶州市| 宁陕县| 新干县| 威远县| 哈尔滨市| 龙胜| 永嘉县| 肥东县| 广昌县| 余姚市| 治多县| 仲巴县|