Lodash:字符串末尾的模式匹配

时间:2015-07-27 18:20:26

标签: javascript underscore.js lodash

我的文件格式如下所示。

  

'这是评论   #方法1
  XQ#1234
  结束   
  #方法2
  XR#1234
  HR#9620
  END

我的目标是大块,但是展望END的每个实例。

var instructions = _(fs.readdirSync(filepath))
  .filter((file) => _.endsWith(file, '.assembly'))
  .map((filename) => fs.readFileSync(path.join(filepath, filename)).toString('ascii').split('\n'))
  .flatten()
  .reject((str) => /^\s*$|^[\\\'\"].*/g.test(str))
  // ^ the contents of the files with the comments and blank lines removed.
  // here is where I get lost
  .chunk( /** ??? */ )

最终目标是拥有这样的东西:

[ ['XQ#1234'], ['XR#1234', 'HR#9620'] ]

我遇到的主要问题是根据“END”的每个实例对数组进行分块,而不是使用两个分隔符(例如BEGINEND)。我认为必须使用_.findIndex来帮助解决这个问题。

如何根据lodash中的结束分隔符对字符串的出现进行分块?

1 个答案:

答案 0 :(得分:1)

您正在寻找分割功能:

_.mixin({"split": function(arr, f) {
    return _.reduce(arr, function(r, x) {
       if(f(x)) {
           r.push([]);
       } else {
           r[r.length - 1].push(x)
       }
       return r;
    }, [[]]);
}});

并像这样使用它:

var instructions = _(fs.readdirSync(filepath))
  .filter((file) => _.endsWith(file, '.assembly'))
  .map((filename) => fs.readFileSync(path.join(filepath, filename)).toString('ascii').split('\n'))
  .flatten()
  .reject((str) => /^\s*$|^[\\\'\"].*/g.test(str))
  .split((str) => "END" == str)

或者如果你不想在lodash上添加一个新的mixin:

...
.reject((str) => /^\s*$|^[\\\'\"].*/g.test(str))
.reduce(function(r, x) {
   if("END" == x) {
       r.push([]);
   } else {
       r[r.length - 1].push(x)
   }
   return r;
}, [[]]);