Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找'*''**';和'`';从字符串中删除并替换为<;strong></strong>;及<;代码></javascript中的cod,Typescript_Javascript_Typescript_Ecmascript 6_Ecmascript 2016 - Fatal编程技术网

查找'*''**';和'`';从字符串中删除并替换为<;strong></strong>;及<;代码></javascript中的cod,Typescript

查找'*''**';和'`';从字符串中删除并替换为<;strong></strong>;及<;代码></javascript中的cod,Typescript,javascript,typescript,ecmascript-6,ecmascript-2016,Javascript,Typescript,Ecmascript 6,Ecmascript 2016,我们需要处理一个“字符串”,将“*”和“***”之间的所有文本用包围起来,同样地,将backTic之间的文本用包围起来。现在我已经编写了逻辑,它也可以很好地工作,但是我确信,一定有更好的方法,因为对于这个简单的字符串处理任务来说,代码太多了。下面是我的代码。感谢您的建议 输入=“*在单星*内**和**在双起点**内,这是`反勾选字符串'” 输出=“在单星内和在双启动内这是反勾选字符串” 您可以使用正则表达式对**和*之间的所有文本进行分组。使用此组,您可以在替换字符串中使用它,方法是使用$1引用

我们需要处理一个“字符串”,将“*”和“***”之间的所有文本用
包围起来,同样地,将backTic之间的文本用
包围起来。现在我已经编写了逻辑,它也可以很好地工作,但是我确信,一定有更好的方法,因为对于这个简单的字符串处理任务来说,代码太多了。下面是我的代码。感谢您的建议

输入=
“*在单星*内**和**在双起点**内,这是`反勾选字符串'”

输出=
在单星内在双启动内这是
反勾选字符串


您可以使用正则表达式对
**
*
之间的所有文本进行分组。使用此组,您可以在替换字符串中使用它,方法是使用
$1
引用它。我们也可以用backticks做同样的事情,但是,取而代之的是,在
标记中围绕匹配的组

const str='*在单星*中,**在双起点**中,这是'backtick string';
const processpipeline=s=>
s、 替换(/\*{1,2}(.*?\*{1,2}/g,“$1”)
.替换(/`(.*?`/g,
$1
'); const res=过程管道(str); 控制台日志(res);
document.body.innerHTML=res不是最好的方法。但是短代码

var converter=new shodown.converter();
var input=“*在单星*内**和**在双启动**内**,这是`反勾选字符串'”;
var输出=converter.makeHtml(输入);
output=“\”“+output+”\“”
输出=输出。替换(//g,“”)
output=output.replace(//g,“”)
output=output.replace(//g,)
output=output.replace(//g,“”)
console.log(输出)

动态html有点棘手,我想研究一下作为JS一部分的
呈现
函数,这似乎是一种更为惯用的方式,然后从标准函数返回html似乎您想要实现标记语法。为什么不使用现有的降价分析器?@Amadan我没有使用降价分析器,但正如你给我指出的那样,我会研究它。谢谢您的意见。您可以按照建议使用降价by@Amadan,仅启用您描述的功能子集:这将允许使用星号。你可以使用反向引用,但我不确定支持有多好。它应该做两件不同的事情,这取决于它是单星号还是双星号。@hugo如果它应该做两件不同的事情,那就是当你做
*foo*
**foo**
时。但是,我希望
*foo**
**foo*
要么是语法错误,要么是多余的星号保持不变。我会使用
/(\*{1,2})(.*?\1/
,就像mpen建议的那样,或者分成两个不同的regexp(我知道的所有regexp引擎都普遍支持反向引用)。它是写给答案的作者的。当然,你所指出的更令人担忧,使解决方案变得不可行,但我发表评论时,你的信息还没有出现。@Akash嗨,我相信有一种方法可以这样做,
*mismatched**
不会被解析,正如mpen所建议的那样,我们将使用反向引用。但是,我不是正则表达式专家,所以我不能100%确定如何实现这一点。您正在使用@Amadan建议的标记解析器。谢谢你的解决方案。我将再次检查这个标记解析器,因为我在过去没有使用过它们+谢谢你的努力。
transform(data: any) {
        if (data) {
            const processDblStar = (input) => {
                const regExforDoubleStar = /(\*\*)+/gi;
                let i = 0;
                const result = input.replace(regExforDoubleStar, (match, matchedStr, offset) => {
                    i++;
                    return i % 2 === 0 ? '</strong>' : '<strong>';
                });
                return result;
            };

            const processSingleStar = (input) => {
                const regExforSingleStar = /(\*)+/gi;
                let i = 0;
                const result = input.replace(regExforSingleStar, (match, matchedStr, offset) => {
                    i++;
                    return i % 2 === 0 ? '</strong>' : '<strong>';
                });
                return result;
            };

            const processBackTick = (input) => {
                const regExforBackTick = /(\`)+/gi;
                let i = 0;
                const result = input.replace(regExforBackTick, (match, matchedStr, offset) => {
                    i++;
                    return i % 2 === 0 ? '</code>' : '<code>';
                });
                return result;
            };

            const processPipeline = (functions) => (inputStr) => functions.reduce((result, fn) => fn(result), inputStr);

            const funcArr: Function[] = [];
            if (data.indexOf('`') >= 0) {
                funcArr.push(processBackTick);
            }
            if (data.indexOf('*') >= 0) {
                funcArr.push(processSingleStar);
            }
            if (data.indexOf('**') >= 0) {
                funcArr.push(processDblStar);
            }

            processPipeline(funcArr)(data);
        }
    }