【问题标题】:Reverse Regular Expression Matching in JavascriptJavascript中的反向正则表达式匹配
【发布时间】:2015-04-18 05:31:50
【问题描述】:

我有一个包含输入和输出基本示例的文件:

[Database.txt]
Hello*==Hello. How are you?
How*are*you*==I am fine I guess.
Can you*die*==I can not die. I am software.

我会得到一个没有标点符号的输入字符串。

例如:“你能在一百万年后死去吗?”

我正在尝试将输入与“==”左侧的数据库的第一侧进行匹配,并返回与第一侧匹配的字符串的第二侧。 所以输入=“你能在一百万年后死吗”,输出=“我不能死。我是软件。”

我必须使用原生 JavaScript。这是我一直在从事的个人项目的一部分,并且在 4 个月内无法通过。它是独立的自然语音引擎的一部分,可以下载文件,将其读取到变量中,并将其用作参考。我已经尝试过循环循环、在“==”处拆分、str.match() 以及许多其他内容的组合。我将处理不区分大小写的问题。任何帮助将不胜感激。

【问题讨论】:

  • 看起来不难。但是你能展示一下你当前的代码是如何解析你的数据的吗?
  • 如果您改变主意并允许 bash 工作,请告诉我,这将是小菜一碟。
  • 你会很快用完汽油非常尝试使用正则表达式来做到这一点。
  • @torazaburo 不幸的是,JavaScript 中没有原生的高级解析器。 OP 可能希望在改进解析器之前让他的系统运行,而正则表达式会让他很快到达那里。
  • @Touffy 是的,让他很快到达那里,然后他会撞到砖墙或悬崖上,选择你的比喻。无论如何,JS 中有 大量 的解析器和 NLP 包。建议他现在就从一个开始。

标签: javascript regex file string-matching


【解决方案1】:

您可以将其拆分为一个数组,并将每个左侧变成一个正则表达式。

然后您可以运行一系列测试来找到匹配项。 棘手的部分是您需要进行多项测试,而不仅仅是一个超级正则表达式。我使用 [].some() 在找到第一个匹配项后终止。您可以使用 filter 更改 some 并收集输出以获得多个匹配项。

var gaunlet=[],
 str="[Database.txt]\n\
Hello*==Hello. How are you?\n\
How*are*you*==I am fine I guess.\n\
Can you*die*==I can not die. I am software.";

str.split("\n").forEach(function(a,b){
    var r=a.split("==");
    gaunlet[b]=[RegExp(r[0].replace(/\*/g,"[\\w\\W]*?"), "i"), r[1]];
});

function lookup(inp){
  var out;
    gaunlet.some(function(a){
        if(a[0].test(inp)) return out=a[1];
    });
  return out;
}


alert(lookup("can you die in a million years?"));

小提琴:https://jsfiddle.net/joaze5u6/1/

我还为 js 捕获通配符的方式编写了一个修复程序,[\w\W]*? 做了 .*? 应该做的事情,但在 js 中却没有......

【讨论】:

  • 为什么是+ 而不是*?在“Hello*”中,您显然只想匹配“Hello”。
  • 是的,虽然最好在单词和 * 之间使用 + 在模式的末尾...
  • 结果完美(经过一些小的修改)。谢谢你。我尝试使用 Bourne Shell,但没有 awk、sed 和 grep,无法在规定的时间内完成。
  • 我发现了“第 2 次”行为。每次它试图找到一个新的匹配项时,它所花费的时间几乎翻了一番。我有一个大型数据库并尝试将其拆分,但在大多数情况下,它仍然需要相同的时间循环遍历数据库的不同部分,这些部分更有可能基于人称代词进行匹配。灾难性的回溯?
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2011-11-29
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多