【问题标题】:How to get an array of some parts of a text如何获取文本某些部分的数组
【发布时间】:2019-08-03 12:32:36
【问题描述】:

我有一些文字,包括文章的数量;我需要得到这些数字的数组(包括文章),然后是“标记词”。 f.e.在文本中:

“123456/9902/001 一二三手 123456/9902/002 肥得手 123456/9902/003 五六 123456/9902/004 七十黄油”

“标记词”= [hand,ten] 的结果数组将是:

["123456/9902/001一二三手","123456/9902/004七十黄油"]

我的代码找到了一些东西,但它工作错了,正确的正则表达式应该是什么?

let markers = ["hand", "ten"],
  fin = [];
let num = "(\\d{6}\/\\d{4}\/\\d{3}).*?";
markers.forEach(item => {
  let reg = new RegExp(num + item, 'gmi');
  found = text.match(reg);
  found.forEach(item => fin.push(item));
  if (result) {
    console.log(`for ${item} : ${found.length}`);
    console.log(found);
  } else {
    (console.log('Nothing'))
  }
})
console.log(fin)

【问题讨论】:

    标签: javascript xregexp


    【解决方案1】:

    您可以先使用以下代码分析文本:

    function findArticles(text) {
      return text.match(/(?:\d{6}\/\d{4}\/\d{3})(?: [a-zA-Z]+)+/g).map(item => item[0])
    } 
    

    然后按标记获取文章:

    function getArticleByMarker(articles, marker) {
        let result = null
        articles.forEach(article => article.indexOf(marker) > 0 ? result = article : undefined)
        return result
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用它来将字符串拆分为不同的文章名称,然后过滤掉那些不包含标记词的文章,而不是使用正则表达式来提取所需的文章。这是一个例子:

      const markers = ['hand', 'ten']
      const str = `123456/9902/001 one two three hand 123456/9902/002 fat got lot 123456/9902/003 five six 123456/9902/004 seven ten butter`;
      
      const articleNames = str.split(/(?=\d{6}\/\d{4}\/\d{3})/);
      
      const articleNamesWithMarkers = articleNames.filter(articleName => markers.some(marker => articleName.includes(marker)));
      
      console.log(articleNamesWithMarkers);

      【讨论】:

      • 谢谢Titus-帮助了我,谢谢Cider,那也很好!。
      【解决方案3】:

      您可以使用前瞻正则表达式将文章拆分为一个数组,然后通过基于标记的正则表达式过滤该数组:

      let text = "123456/9902/001 one two three hand 123456/9902/002 fat got lot 123456/9902/003 five six 123456/9902/004 seven ten butter";
      
      let markers = ["hand","ten"];
      let regex = new RegExp("\\b("+markers.join("|")+")\\b", "");
      let result = text.split(/(?=\s*\d{6}\/\d{4}\/\d{3})/).filter(art => regex.test(art));
      
      console.log(result);

      如果您的标记包含在正则表达式中具有特殊含义的字符,您需要escape 他们。

      【讨论】:

      • 喜欢它!谢谢,这当然是我一直在问的
      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多