使用正則替換textarea種的重復(fù)行
有這么個(gè)需求,將textarea中的重復(fù)行去掉。結(jié)果將每行join(",")。
最開始拿到這個(gè)需求時(shí),想當(dāng)然的這么寫了:
沒有問題,很常規(guī)的做法。后來(lái)總想是不是可以用正則去做這個(gè)事情,順便可以溫習(xí)一下正則,經(jīng)反復(fù)測(cè)試,寫出了一個(gè)下面的代碼:
就這么個(gè)正則折騰了一上午,當(dāng)然,字符串也是取了一個(gè)比較極端的情況,比如即有a又有aa (行內(nèi)容包含的情況),3次出現(xiàn)的情況,首尾重復(fù)的情況。
去除重復(fù)的正則用了寬度斷言和反響引用。所謂寬度斷言就是可以判斷后面/前面的匹配,但是不占用匹配的位置,也就是不影響后面的匹配,他只是一種斷言,比如上面的(?=reg),就是正向?qū)挾葦嘌?,能斷言后面的出現(xiàn)了之前匹配組內(nèi)容。反向引用時(shí)指可以引用之前匹配的引用組,比如上面的去除重復(fù)中的正則\1 就反向應(yīng)用了第一個(gè)匹配組((\,[^\,]+)|(^[^\,]+)) 匹配的內(nèi)容。
當(dāng)然,上面的正則肯定不是最優(yōu)的,希望大家指點(diǎn)了。
可以參考正則表達(dá)式30分鐘教程
正則的寬度斷言 http://deerchao.net/tutorials/regex/regex.htm#lookaround
負(fù)向?qū)挾葦嘌?amp;反向引用:http://deerchao.net/tutorials/regex/regex.htm#negativelookaround
最開始拿到這個(gè)需求時(shí),想當(dāng)然的這么寫了:
var s ="a\r\na\r\naa\r\nc\r\nc\r\nc\r\n\r\nb\r\nb\r\n";
var o={},//記錄不重復(fù)的行
arr= s.split(/\r?\n/gi),//取到textarea值時(shí)IE中的回車是\r\n,!IE只是\n
i=arr.length,
result="";
while(i--){
if(arr[i] && (!o[arr[i]])) o[arr[i]]=1;
}
for (var k in o ){
if(result!="") result=result+",";
result+=k;
}
alert(result);
var o={},//記錄不重復(fù)的行
arr= s.split(/\r?\n/gi),//取到textarea值時(shí)IE中的回車是\r\n,!IE只是\n
i=arr.length,
result="";
while(i--){
if(arr[i] && (!o[arr[i]])) o[arr[i]]=1;
}
for (var k in o ){
if(result!="") result=result+",";
result+=k;
}
alert(result);
沒有問題,很常規(guī)的做法。后來(lái)總想是不是可以用正則去做這個(gè)事情,順便可以溫習(xí)一下正則,經(jīng)反復(fù)測(cè)試,寫出了一個(gè)下面的代碼:
var s ="a\r\na\r\naa\r\nc\r\nc\r\nc\r\n\r\nb\r\nb\r\n";
var regResult =s.replace(/\r?\n/gi,",") // \r\n->,
.replace(/((\,[^\,]+)|(^[^\,]+))(?=((.*\1\,)|(.*\1$)))/gi,"") //去除重復(fù)
.replace(/^\,|\,$|\,(?=\,)/gi,"");//去掉多余的,
alert(regResult);
var regResult =s.replace(/\r?\n/gi,",") // \r\n->,
.replace(/((\,[^\,]+)|(^[^\,]+))(?=((.*\1\,)|(.*\1$)))/gi,"") //去除重復(fù)
.replace(/^\,|\,$|\,(?=\,)/gi,"");//去掉多余的,
alert(regResult);
就這么個(gè)正則折騰了一上午,當(dāng)然,字符串也是取了一個(gè)比較極端的情況,比如即有a又有aa (行內(nèi)容包含的情況),3次出現(xiàn)的情況,首尾重復(fù)的情況。
去除重復(fù)的正則用了寬度斷言和反響引用。所謂寬度斷言就是可以判斷后面/前面的匹配,但是不占用匹配的位置,也就是不影響后面的匹配,他只是一種斷言,比如上面的(?=reg),就是正向?qū)挾葦嘌?,能斷言后面的出現(xiàn)了之前匹配組內(nèi)容。反向引用時(shí)指可以引用之前匹配的引用組,比如上面的去除重復(fù)中的正則\1 就反向應(yīng)用了第一個(gè)匹配組((\,[^\,]+)|(^[^\,]+)) 匹配的內(nèi)容。
當(dāng)然,上面的正則肯定不是最優(yōu)的,希望大家指點(diǎn)了。
可以參考正則表達(dá)式30分鐘教程
正則的寬度斷言 http://deerchao.net/tutorials/regex/regex.htm#lookaround
負(fù)向?qū)挾葦嘌?amp;反向引用:http://deerchao.net/tutorials/regex/regex.htm#negativelookaround
posted on 2011-06-17 12:16 衡鋒 閱讀(861) 評(píng)論(3) 編輯 收藏 所屬分類: javascript