如何在Javascript中编写一种有效的方式来处理匹配模式?

马尧

我想生成匹配特定模式的字符串。例如,该函数将采用两个参数:

function parsePattern(pattern, string) {}

并且接受的模式可能是 '(hello|hi), %i, (how are you|nice to see you)' 并且如果第二个参数以这种方式设置为 'John'

parsePattern('(hello|hi), %i, (how are you|nice to see you)', 'John')

我希望输出具有所有可能的组合:

 'hello, John, how are you'
 'hello, John, nice to see you'
 'hi, John, how are you'
 'hi, John, nice to see you'

实现这一目标的最佳方法是什么?

密塔瑞尔

您正在寻找与正则表达式通常用于相反的操作,因此对于更通用的正则表达式模式(如\w+. 但是,如果您只是想为A|B示例中的模式类型生成结果,这里有一些代码可以实现这一点。这利用了StackOverflow 自己的 formatUnicorn 函数以及这里给出的笛卡尔积函数当然,您可以用自己的替换这些。

JSFiddle:https ://jsfiddle.net/aro108zc/

String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
  function () {
  "use strict";
  var str = this.toString();
  if (arguments.length) {
    var t = typeof arguments[0];
    var key;
    var args = ("string" === t || "number" === t) ?
        Array.prototype.slice.call(arguments)
    : arguments[0];

    for (key in args) {
      str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
    }
  }

  return str;
};

function cartesianProduct(arr) {
  return arr.reduce(function (a, b) {
    return a.map(function (x) {
      return b.map(function (y) {
        return x.concat([y]);
      })
    }).reduce(function (a, b) { return a.concat(b) }, [])
  }, [[]])
}

function parsePattern(pattern, str) {
  var regex = /\(([^|()]+\|)*[^|()]+\)/g;
  var results = [];

  var matches = pattern.match(regex);

  // replace input string match groups with format strings
  matches.forEach(function (el, idx) {
    pattern = pattern.replace(el, '{' + (idx + 1) + '}');
  });

  // split matches into parts
  var matchesSplit = [];

  matches.forEach(function (el, idx) {
    matchesSplit[idx] = el.replace(/[()]/g, '').split('|');
  });

  // generate result strings
  matchesSplit.splice(0, 0, [str]);

  cartesianProduct(matchesSplit).forEach(function (el) {
    results.push(pattern.formatUnicorn(el));
  });

  return results;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

一种有效的方式,以列表<Integer>的转换为INT [](数组)无迭代

内存有效的方式来处理大型HashMap

是否有一种优雅的方式来处理二十一点中的Ace?

一种有效的Scala惯用方式来挑选排序值的前85%?

CGDisplayCopyAllDisplayModes排除了一种有效模式

一种更有效的方式来清洁字符串列并添加新列

dplyr根据条件以一种有效的方式在单个列中变异替换值

如何在React中重用一种方法来处理多个不同的引用?

从C ++中的输入收集数据时,有没有一种更有效的方式来处理变量?

Neo4j是否有一种更有效的方式来编写多个where-contains?

有没有一种有效的方法来处理多个复选框来更改wxPython中的一个变量?

如何在模式匹配后仅对一种模式中的一种模式进行grep行

如何以更有效,更短的方式编写Javascript

需要一种更有效的方式来合并文本文件

如何向R中的向量累计应用自定义函数?以一种有效且惯用的方式吗?

模板中的方法:一种有效,一种不实例化

需要一种有效的方法来处理C ++中的ReadDirectoryChangesW

有没有一种资源有效的方式将文件加载到数据库中?

一种更优雅的方式来处理同一servlet中的不同请求

这些向JavaScript中的现有对象添加属性的方法有何不同(一种有效,一种无效)?

寻找一种更有效的方式编写我的MATLAB代码

寻找一种更有效的方式编写此jquery菜单

我应该如何在 Selenium 中以一种方法检查 5 个有效登录?

bash 脚本 - 如何编写有效的 case 语句来处理多个条件

是否有一种 Pythonic 方式来处理可能包含 None 的对象链?

在 ruby 中编写嵌套“for”的另一种有效方法?

有一种更短/优雅/有效的方式来写这个吗?

如何在python中打印形状?寻找一种不同的、更有效的方式

Swift 5.1 - 是否有一种干净的方法来处理子字符串/模式匹配的位置