【发布时间】:2015-11-16 14:23:24
【问题描述】:
我有一个问题,我已经考虑了一段时间,但未能找到最佳解决方案。
该应用程序适用于一家根据号码模式以不同价格出售特殊电话号码的公司。
所以用户有一堆数字。并使用某种约定定义模式。例如:
- (ABCDEFG) 表示序列为 (1234567, 或 2345678 等...)。
- (ZYX-ZYXW) 表示一个数字,例如 (654-6543)。
客户取号时,该号码应与其匹配的图案相匹配,当一个图案匹配时,该号码按匹配的图案的价格收费。
我的想法集中在三个可能的解决方案上:
- 我试图考虑正则表达式。但不确定是否可以 工作。
- 另一种解决方案是遍历每种可能性 对于每个模式并将其与购买的号码相匹配。但是我 我确信这在性能方面太昂贵了。
- 最后我想在用户添加一个时保存所有可能的数字 模式,这样当客户想要购买一个新号码时, 应用程序不搜索模式,但搜索实际数字。这 用户添加模式时性能瓶颈的方式 (这比客户选择号码的频率要低得多)。
你们对我应该使用哪种方法有什么建议吗?非常感谢任何提示。
编辑:
我对收到的回复感到非常高兴。它们都很有启发性,但到目前为止还不能解决我的问题。现实世界的场景将具有以下条件:
- 某些模式会遵循某种数字顺序(顺序或非顺序),例如:ABCDEFG=1234567 或 ACEGECA=2468642。
- 某些模式将基于数字的重复,例如:xyxyxyx=1919191 或 xyxzxyx=2829282。我想以某种方式我们可以将这个条件包含在上面的条件中。
- 某些模式会有硬编码数字,例如 ABC0ABC 或 123xyxy
- 模式的可能性没有限制。
到目前为止,所有提出的方法都有其自身的局限性。我还在想,所以如果你想出任何有用的命中,请与我分享!
【问题讨论】:
-
正则表达式就可以了。例如,
ZYX-ZYXW可以与^(\d)(\d)(\d)-\1\2\3\d$或^(\d)((?!\1)\d)((?!\1|\2)\d)-\1\2\3(?!\1|\2|\3)\d$匹配,如果您想确保 X、Y、Z 和 W 都是不同的数字。 -
更复杂的模式呢,比如 (ACEGECA) like (2468642)。问题是我不知道会是什么样的模式。如果我选择正则表达式方法,我需要开发一个解决方案,将正常使用添加的模式转换为正则表达式模式。这甚至可能吗?
-
是的,这是可能的。我会写一个答案。在上面的示例中,您真的需要 A != C 吗?
-
实际上有两种模式:一种使用可能重复也可能不重复的序列(ABC-FGH)。另一种是使用重复数字(xyxyxyx,xxy*yxx)。
-
我偶尔会遇到类似这些问题的问题(通常与 DNA 测序有关)。过去,所采用的解决方案似乎经常涉及应用程序级别的代码——而不是试图在 SQL 上解决问题,以防万一你是这么想的。