【发布时间】:2013-05-07 06:39:31
【问题描述】:
在我的应用程序中,我需要将一些字符串与一个模式进行匹配。假设一些示例字符串如下所示:
- 你好,约翰。
- 今天真是美好的一天!
- 今天的日落很美,约翰,不是吗?
- 约翰,你今天会见琳达吗?
这些字符串中的大多数(不是全部)来自预定义的模式,如下所示:
- “你好,%s。”
- “今天真是美好的一天!”
- “今天的日落很美,%s,不是吗?”
- “你今天会见 %s 吗,%s?”
这个模式库不断扩大(目前大约有 1,500 个),但需要手动维护。但输入字符串(第一组)在很大程度上是不可预测的。虽然它们中的大多数会匹配其中一种模式,但其中一些不会。
所以,这是我的问题:给定一个字符串(来自第一组)作为输入,我需要知道它匹配哪个模式(已知的第二组)。如果没有匹配项,它需要告诉我。
我猜测解决方案涉及从模式中构建一个正则表达式,并反复检查哪个匹配。但是,我不确定构建这些正则表达式的代码是什么样的。
注意:我在此处给出的字符串仅用于说明目的。实际上,这些字符串不是人类生成的,而是计算机生成的人类友好的字符串,如上所示,来自我无法控制的系统。由于它们不是手动输入的,因此我们无需担心诸如拼写错误和其他人为错误之类的事情。只需要找到它匹配的模式。
注 2:我可以将模式库修改为其他格式,如果这样可以更容易地构造正则表达式。具有 printf 样式 %s 的当前结构并非一成不变。
【问题讨论】:
-
要求的性能是什么? 1500 个字符串上的正则表达式可能不是世界上最快的……你可以从计算一些字符开始,也许只是第一个字符(不包括空格),然后传递给正则表达式。
-
@lunadir 性能必须是一流的。我必须每秒处理大约 6000 个这样的字符串,但我可以使用多个进程。我一直不考虑性能,因为我想先有一个简单的工作解决方案。
-
@lunadir 另外,它不需要是一个正则表达式。它可能是 1500 个不同的正则表达式以及一些 if/else 语句,运行在 JS 中的预生成函数(从
new Function创建)中,如果这有助于获得更好的性能。 -
输入对预制字符串的遵守应该有多严格?只是最低限度?一个字一个字地?甚至空格和逗号?
-
@lunadir 我现在不确定松懈会如何影响比赛的质量,所以我会选择“非常严格”。不过不完全确定。
标签: regex node.js pattern-matching