将Javascript解决方案转换为函数式编程方法

将Javascript解决方案转换为函数式编程方法,javascript,regex,ramda.js,Javascript,Regex,Ramda.js,我最近(非常)对函数式编程非常感兴趣,尤其是如何将其应用到我的JavaScript工作中。在回答了一个关于regex使用(link)的问题后,我继续发展了一些想法,目的是将其与函数式编程方法进行比较 挑战在于编写一个简单的输入解析器,它接受一个正则表达式和一些输入,并返回一个匹配的对象数组(这是更大的解决方案的第一步,但我想从简单开始)。我使用的是更传统的方法,但也希望使用与函数式编程相同的方法(我使用的是ramda.js,但只要是JavaScript,就可以使用任何函数式编程方法) 以下是工作

我最近(非常)对函数式编程非常感兴趣,尤其是如何将其应用到我的JavaScript工作中。在回答了一个关于regex使用(link)的问题后,我继续发展了一些想法,目的是将其与函数式编程方法进行比较

挑战在于编写一个简单的输入解析器,它接受一个正则表达式和一些输入,并返回一个匹配的对象数组(这是更大的解决方案的第一步,但我想从简单开始)。我使用的是更传统的方法,但也希望使用与函数式编程相同的方法(我使用的是ramda.js,但只要是JavaScript,就可以使用任何函数式编程方法)

以下是工作代码:

var parseInput = function (re, input) {
  var results = [], result;
  while ((result = re.exec(input)) !== null) {
    results.push({
      startPos: result.index,
      endPos: re.lastIndex - 1,
      matchStr: result[1]
    })
  }
  return results;
};

var re = /<%([^%>]+)%>/g;
var input = "A <%test.child%><%more%> name: <%name%> age: <%age%> EOD";

var results = parseInput(re, input);
console.log(results);
这就是我想要的结构和结果

特别是,我一直在尝试使用Ramda和'match()'函数,但我找不到一种干净的方法来获取我正在寻找的对象数组(除了运行match()来获取匹配数组,然后在原始输入中查找每个匹配,这似乎不比我当前的解决方案更麻烦)


非常感谢您的指导。

只需稍微修改您的正则表达式,您可以使用
String.prototype.match()
方法执行以下操作

var str=“A name:age:EOD”,
雷克斯=/[^)/g,
res=str.match(rex);

console.log(res);
你是对的,Ramda的
match
对你没有帮助。它是为更简单的用途而设计的。我看不到比你的代码更好的东西,尽管我可能会以不同的方式考虑它:

const execAll = R.curry((re, convert, input) => {
  let results = [], result;
  while ((result = re.exec(input))) {
    results.push(convert(result))
  }
  return results;
});

const parseInput = execAll(/<%([^%>]+)%>/g, match => ({
  startPos: match.index,
  endPos: match.index + match[0].length - 1,
  matchStr: match[1]
}));

const input = "A <%test.child%><%more%> name: <%name%> age: <%age%> EOD";

parseInput(input);
如果您感兴趣,可以在上查看此信息


但请注意,这与您的方法没有太大的变化。我没有发现一种适用于一系列正则表达式的明显不同的方法。

此解决方案没有我要查找的对象的起始位置和结束位置。使用R.match()可以很容易地获得相同的结果-Ramda中的一个函数,使用我当前的正则表达式,但不是对象数组。我正在寻找一个应用函数编程概念的答案,以扩大我的理解。@rasmeister好的,我的答案中包含了一个代码,它将为您提供您正在寻找的对象,而不使用正则表达式。谢谢Scott。这正是我想要的我问这个问题是因为我找不到删除对regex状态依赖的方法。您的解决方案提供了这一点。我喜欢数据格式的分离,对curry的注释也很有帮助。
const execAll = R.curry((re, convert, input) => {
  let results = [], result;
  while ((result = re.exec(input))) {
    results.push(convert(result))
  }
  return results;
});

const parseInput = execAll(/<%([^%>]+)%>/g, match => ({
  startPos: match.index,
  endPos: match.index + match[0].length - 1,
  matchStr: match[1]
}));

const input = "A <%test.child%><%more%> name: <%name%> age: <%age%> EOD";

parseInput(input);
const execAll = (re, convert) => (input) => { /* ... */ }