首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段标记化字符串以包含不包含令牌的部分

分段标记化字符串以包含不包含令牌的部分
EN

Stack Overflow用户
提问于 2016-06-14 20:46:01
回答 3查看 97关注 0票数 3

背景信息:

目前正在处理一个word add,它将要求我使用不同的样式,这取决于指定的开始和结束令牌,即~~randomTextandChar~~...........~~end~~。我目前正在继续分割,但是这将忽略一个可能没有令牌的段落,并将其与包含令牌的段落合并。

当前问题:

当我根据样式分割段落时,我使用的是contentToInsert.split("~~end~~");,但是当一个段落不包含指定的标记时,它与下一个具有标记的段落组合在一起,使两个段落获得相同的样式。

期望结果

我想根据一个段落来分割,但是,我也想把没有标记的部分分开。这样,我现在就不会需要任何类型的样式了。参考下面的案文,我希望有一个由三个元素组成的数组,每个段落一个。

示例文本

/Document标题1,第1段,标题1,/Document标题1,1Pellentesque的居民morbi,et netus et malesuada fames ac turpis egestas。前庭,前庭。欧盟的自由也是一样的。乌尔三叶草属植物。狮子座毛里士。奎斯克坐得很好。[医][医]、[医][医]、[医]Aenean发酵,elit eget除铁条件,eros ipsum rutrum orci,矢状窦炎,lacus。不含蛋鸡的肉鸡。尤特·菲利斯。普拉森达皮布斯,新的id cursus faucibus,酷刑neque egestas augue,欧盟外阴大eros欧洲erat。阿利古姆·埃拉特·瓦特帕特南迪米,镀锡奎斯,蓄积式转运器,利氏器,元尾

第2段,NormalPellentesque的居住者morbi,tristique,et netus et malesuada,名声,ac turpis egestas。前庭,前庭。欧盟的自由也是一样的。乌尔三叶草属植物。狮子座毛里士。

/Document标题2,第3段,/Document标题2 2Morbi,在sem quis dui placerat ornare.好的,好的,好的。Sed arcu。结果是。普拉森达皮布斯,新的id cursus faucibus,酷刑neque egestas augue,欧盟外阴大eros欧洲erat。阿利古姆·埃拉特·瓦特帕特南酒米,锡锡特准,蓄积式转运器,无花果,美特斯。[医][医]水曲柳。基斯克是个说教人。圣洁,小韧带,外阴,接缝,三位一体。南明古拉干,孕妇非,康莫多a,苏丹莱斯同坐,尼西。乳白色发酵酒。淫羊藿,方便拍卖者,超粉,秃鹫素,努克。结束

电流码

代码语言:javascript
复制
  var contentToInsert = selectedContent.toString();

        if (selectedContent.toString().search("~~") <= 0) {

        contentToInsertWithStyles = contentToInsert.split("~~end~~");
        var elementToInspect;

        for (var x = 0; x < contentToInsertWithStyles.length; x++) {

            elementToInspect = contentToInsertWithStyles[x].toString().search("~~");
            //-1 is given if the string does not contain designated char
           //[Not working as desired]
            if (elementToInspect === -1) {
                segmentedStyles.push({
                    ContentStyle: "Normal",
                    ContentText: contentToInsertWithStyles[x]
                });
            }

            else {
                var styleType = contentToInsertWithStyles[x].match(/~~([^]+)~~/);
                segmentedStyles.push({
                    ContentStyle: styleType[1],
                    ContentText: contentToInsertWithStyles[x].replace(styleType[0], '').trim()
                });
            }
        }
    }

附录

这个代码不起作用,它只是按照结束分裂,这个代码的结果将结合第2段和第3段,使我不想要的数组元素。我希望有三个数组元素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-14 21:15:17

此函数解决了您的问题:

代码语言:javascript
复制
function getSegmentedStyles(text) {
    var pattern = /^~~((?:(?!~~).)+)~~((?:(?!~~end~~).)+)~~end~~/gm;
    var pos = 0;
    var match;
    var result = [];

    function trim(str) {
        return str.replace(/(^\s+)|(\s+$)/, "");
    }

    function add(style, content) {
        var trimmed = trim(content);
        if (trimmed) {
            result.push({
                ContentStyle: style,
                ContentText: trimmed
            })
        }
    }

    while (match = pattern.exec(text)) {
        if (match.index > pos) {
            add("Normal", text.substr(pos, match.index));
        }

        add(match[1], match[2]);

        pos = match.index + match[0].length;
    }

    if (pos < text.length) {
        add("Normal", text.substr(pos));
    }

    return result;
}

pattern与样式块匹配。匹配之间的文本段被添加为“普通”段。此外,从块中移除前导和尾随空格,忽略空块。

有关工作示例,请参阅此JSFiddle:

https://jsfiddle.net/o17Lq11x/

或者看一下这个regex-101片段,它显示了如何捕获样式块:

https://regex101.com/r/xM9bD0/1

票数 1
EN

Stack Overflow用户

发布于 2016-06-14 20:59:27

也许您可以使用像这样的正则表达式

代码语言:javascript
复制
\[(.*)?\](.*)?((~~)|\n)

然后你可以在组中找到与整个段落相匹配的。

票数 1
EN

Stack Overflow用户

发布于 2016-06-14 21:59:14

A我强烈建议在ES6中使用字符串模板,不确定它是否真的解决了您在这里的问题,但是它对于处理字符串来说是很棒的。B我还不完全确定你想做什么。我知道你想把所有三段分开。就这些吗?C我想你的其他陈述可能有问题。现在,我不完全确定您想要做什么,但是我发现there语句有两个可能的问题。它返回一个匹配数组,您只需将该数组中的第二个匹配推到分段样式上,我认为这不是您想要的。所以它应该只是插入一个随机。另外,我在jsbin:http://jsbin.com/ditisizuyi/edit?html,js,output上使用regex表达式对整个文本运行了regex表达式,但我知道这并不是您要做的。结果匹配了整个文本,所以您可能需要查看regex,并确保它正在做您希望它做的事情。好吧,在做了很多工作之后。我已经知道了如何分离出所有的标记,如果您想要从原始数组中完全删除它们,可以使用片,而不是substr。这里是:http://jsbin.com/xiporogexo/1/edit?html,js,output

代码语言:javascript
复制
var numArray = [];
var strArray = [];

for(var x = 0; x < string.length; x++){
  if(string.indexOf("~~", x) === x){
    //if it is the first occurance of a tag, take the index, if not, add the number of characters ~~, AKA two to the index number so that we keep the entire tag
    if(numArray.length % 2 === 0){
      numArray.push(x);
    }
    else {
      numArray.push(x + 2);
    }
  }
}

for(var x = 0; x < numArray.length; x++){
  //make sure that the match is between our tags
  if(x % 2 !== 0){
 strArray.push(string.substr(numArray[x], (numArray[x+1] - numArray[x])));
  }
}
//console.logs the resulting tags in an array.
strArray.forEach(function(yolo){
  console.log(yolo);
});

我将首先承认这可能不是最好的解决办法,我可能需要更多地了解情况。然而,我认为这是正确的,你想要做的事情。变量string没有列出,但它是您列出的整个文档的副本。如果你有什么问题请告诉我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37821777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档