鍍金池/ 問(wèn)答/Java  HTML/ 一個(gè)中高階難度的 JavaScript 正則場(chǎng)景

一個(gè)中高階難度的 JavaScript 正則場(chǎng)景

問(wèn)題描述

??這是一個(gè)字符串正則替換的問(wèn)題,我自己想了一晚上也想不出用純正則就能搞定這個(gè)問(wèn)題。但這個(gè)問(wèn)題看起確實(shí)不復(fù)雜,所以來(lái)思否求大佬解答。

??大概的特征是這樣的,我需要在一個(gè)字符串文件中查找類(lèi)似 start template template ... end 的字符串。其中 startend 是固定形式的字符串,template 是一個(gè)正則模式,我需要將位于 startend 之間的滿(mǎn)足 template 模式的字符串前面加一個(gè)前綴 prefix,最后我希望文件中的滿(mǎn)足條件的字符串被修改為 start prefix-template prefix-template ... end 。

問(wèn)題實(shí)例

??下面是一個(gè)例子

var str = "lajishuju..Ejhohaodf98  a.length+b.length+10+:rowspan=a.length + b.length+ c.length20:rowspan=a.length+b.length lajishujudsjalfj)Ufaojd";

??我希望能把 :rowspan=\d+ 之間的 x.length 形式的字符串修改為 sub.x.length。替換后的字符串應(yīng)如下:

"lajishuju..Ejhohaodf98  a.length+b.length+10+:rowspan=sub.a.length + sub.b.length+ sub.c.length20:rowspan=a.length+b.length lajishujudsjalfj)Ufaojd"

??明細(xì)字符串中加入了干擾字符串,如有 :rowspan= 開(kāi)頭卻沒(méi)有 \d+ 結(jié)尾的字符串,和有結(jié)尾卻沒(méi)開(kāi)頭的字符串。

我的想法

??我寫(xiě)出的正則只能利用 (?=) 斷言排除有開(kāi)頭沒(méi)結(jié)尾干擾字符串的干擾,無(wú)法判斷是否具有合理的 :rowspan= 開(kāi)頭。
??懇請(qǐng)大佬指條明路,我和同學(xué)商量一下,他說(shuō)不可能用一個(gè)正則一次解決這個(gè)問(wèn)題。但我覺(jué)的這個(gè)模式特征這么明顯,看起了也很簡(jiǎn)單,如此強(qiáng)大的正則不應(yīng)該做不到,請(qǐng)大佬傳道解惑!

另外

??題目中的“中高階難度”是我大言不慚,畢竟我是個(gè)沒(méi)怎么寫(xiě)過(guò)正則的菜雞?,如有不當(dāng),請(qǐng)見(jiàn)諒!

回答
編輯回答
挽青絲
str.replace(/:rowspan=([^\d]+)\d/g, function($1){return $1.replace(/(\w.length)/g, '^^.$1')})

至少需要2個(gè)正則 因?yàn)橐粋€(gè)正則沒(méi)辦法在選定范圍的情況下同時(shí)匹配里面隨機(jī)個(gè)數(shù)的表達(dá)式

2017年8月14日 11:06
編輯回答
風(fēng)清揚(yáng)
var str = "lajishuju..Ejhohaodf98 a.length+b.length+10+:rowspan=a.length + b.length+ c.length20:rowspan=a.length+b.length lajishujudsjalfj)Ufaojd";

var r = str.replace(/(:rowspan=)(.+?)(?=\d*:rowspan)/g, function (...m)
{
    m[2] = m[2].replace(/\b([a-z]\w*\.length)/g, 'sub.$1');

    return m[1] + m[2];
});

console.log(r);
2018年7月23日 07:41
編輯回答
逗婦惱
var str = "lajishuju..Ejhohaodf98 a.length+b.length+10+:rowspan=a.length + b.length+ c.length20:rowspan=a.length+b.length lajishujudsjalfj)Ufaojd";
let reg=/:rowspan=[^\d]*?(?:([a-z])\.length\s*\+\s*)+(?:([a-z])\.length)[^\d]*?\d+/g;
let result=str.replace(reg,$1=>$1.replace(/([a-z]\.)(?=length)/g,'sub.$1'));
console.log(result);
//lajishuju..Ejhohaodf98 a.length+b.length+10+:rowspan=sub.a.length + sub.b.length+ sub.c.length20:rowspan=a.length+b.length lajishujudsjalfj)Ufaojd
2017年4月4日 10:29
編輯回答
夕顏
var str = "lajishuju..Ejhohaodf98 a.length+b.length+10+:rowspan=a.length + b.length+ c.length20:rowspan=a.length+b.length lajishujudsjalfj)Ufaojd:rowspan=a.length + b.length2fsdfsdfsdf:rowspan=a.length + b.length2";
var gap = ':rowspan=';
var arrs = str.split(gap);
var head = arrs.shift();
var cnt = arrs.map(function(v){
  if(/\d+/.test(v)){
    var m = v.replace(/(\w*\.length)/g,'sub.$1');
    return gap + m;
  }else{
    return gap + v;
  }
});
var ret = head + cnt.join('');
2017年4月28日 00:45