#202020#<font face="Helvetica">this is string entered by a # user #202021# </font><b style=""><font face="Helvetica Neue" style="">#<u>001</u>10# </font></b>
预期结果:#202020#<font face="Helvetica">this is string entered by a # user #202021# </font><b style=""><font face="Helvetica Neue" style="">#00110#<u></u> </font></b>
给定一个如上所述的html字符串,我希望能够重新排列由'#'分隔的字符以及它们之间包含的5位数字。
现在我一直在尝试使用正则表达式来剥离html,然后基于'#'进行拆分,但是它不起作用,因为可能有'#'不是我'''降价的一部分。我也不知道如何重新组合我的字符串块,hmtl标签和“#”数字块的拆分数组。如果我在字符串的'#12345#'部分删除或移出样式并不重要,只要这些字符被分组,因此它们可以任意移动或包裹在散列降序处。
上面的原因是我有一个所见即所得的组件,需要存储这个'#12345#'格式的markdown,在服务器上,它会根据查找表转换为url。在保存时,我希望能够格式化'#'降价。我正在使用的所见即所得的编辑是反应 - 夏令营。
你可以使用string.replace
,一个正则表达式和一个回调来做到这一点。正则表达式
/#([^#]*\d)#/g
寻找两个#
封闭数字和任何不是#
的东西。
在回调中,您删除所有非数字字符,并计算剩余的数字。如果有五个数字,则返回#
中包含的数字,否则,您什么也不做,只返回原始标记。
您还可以使用正向前瞻和后瞻性来捕获#
,在这种情况下,您在更换标签时不需要包含哈希
/(?<=#)([^#]*\d)(?=#)/g
const func = str => str.replace(/(?<=#)([^#]*\d)(?=#)/g, (a, tag) => {
const numbers = tag.replace(/\D/g, ''); // remove non-digits
if (numbers.length === 5) {
return numbers; // return the numbers part of the tag
}
return tag; // return tag untouched
});
console.log(func('#12<b>345</b>6#'));
console.log(func('#1<b>2</b>34#'));
console.log(func('#12345#'));
console.log(func('#1<b>234</b>5#'));