1

如何检测错字,但仅限于特定短语。另一种思考方式是如何检测某个正则表达式的错字。

例如,我不想要一个通用的错字查找器,我在上面找到了多个资源。我不想要一个通用的拼写检查器,我再次找到了多个资源。

我将如何为一个相对恒定的值编写一个错字检查器......比如说:

超级秘密 13-12345

它应该总是说“超级秘密 NN-NNNNN”(N 表示任何 0-9 数字)。

它会将以下内容标记为“拼写错误”:

  1. 超级秘密 13-12345
  2. 超级秘密 1312345
  3. 精子 13-123456
  4. 斯普尔秘密 13-12345
  5. 超级秘密
  6. 13-12345

它不会以下内容标记为“拼写错误”:

  1. 超级秘密 13-12345
  2. 任何其他随机词
  3. 超人飞越丛林

我最担心额外的字符泄漏、转置字符或不遵循 NN-NNNNN 格式的数字。

我觉得这是一个可以回答的问题,但我可能只是没有使用正确的词问 Google 或 SO。

我正在用 .NET 编写它,但显然可以移植任何东西。

4

2 回答 2

1

这不是正则表达式的好地方:您需要一个正则表达式来检测每种可能的错字类型。相反,您应该查看Levenshtein distance。它会像这样工作:

  1. 用占位符替换所有无效字符,例如“!”。
  2. 用不同的占位符替换所有数字,例如“#”。
  3. 计算与“超级秘密##-#####”的 Levenshtein 距离。
  4. 如果距离低于某个值且不为 0,则返回 true。否则,返回假。

实施后,请使用步骤 4 中的阈值来匹配所需的行为。

编辑:“无效字符”可以表示除“Superct0123456789-”中的字符之外的任何字符,也可以表示除“-”之外的任何非字母数字。最终结果应该是一样的。

于 2013-09-09T14:10:59.493 回答
0

为什么不搜索您的号码模式,并查看 Super Secret 呢?如果它不存在,你可以捕捉那里的任何东西,看看它是否是你正在寻找的拼写错误?然后你可以添加一个简单的替换 - 或 re.sub() - 来输入正确的拼写?现在你必须小心,慢慢地构建正则表达式。有一些关于环视的事情不是固定长度的,但我现在忘记了它是向前看还是向后看有这个问题。如果您遇到此问题,有一些解决方法。为您的号码创建单独的捕获组 - 严格和具体 - 为您的短语创建另一个捕获组 - 更加灵活,例如?作为已知可能拼写错误的量词和字符集 [sS]。

于 2019-09-08T13:56:28.830 回答