【问题标题】:How to detect a "typo" for a certain phrase or regex?如何检测某个短语或正则表达式的“错字”?
【发布时间】:2013-09-09 14:01:02
【问题描述】:

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

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

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

超级秘密 13-12345

它应该总是说“Super Secret NN-NNNNN”(N 表示任何 0-9 数字)。

它会将以下内容标记为“错别字”:

  1. 超级秘密 13-12345
  2. 超级秘密1312345
  3. Sper Scret 13-123456
  4. Spuer 秘密 13-12345
  5. 超级秘密
  6. 13-12345

它会将以下内容标记为“错别字”:

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

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

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

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

【问题讨论】:

标签: .net regex algorithm spell-checking phrase


【解决方案1】:

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

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

一旦你实现它,在步骤 4 中使用阈值来匹配所需的行为。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多