首页 > 解决方案 > 确定序列中下一个字符的有效选项

问题描述

说我有正则表达式

const string regex = "[A-Za-z0-9]* [0-9]{1,3} [A-Za-z]* ?[A-Za-z]*";

const string address = "ABC 123 Sesame Street"; // this is a valid match

到目前为止,我输入了“ABC 123 Se”。

作为一个人类,我可以看到下一个字符需要是一个字母。有没有一种算法可以为计算机做到这一点?

我看过Levenshtein 距离算法,但为了让那些提供信息我需要两个字符串,我只有一个字符串和一个正则表达式。拼写检查算法也不完全符合我的情况。

我更喜欢通用解决方案,这样如果由于某种原因我需要允许123 N 4567 W Paris, Idaho我所要做的就是修改正则表达式。

编辑

我应该说,“作为一个人,我可以看到正则表达式不允许下一个字符是数字或特殊字符,所以我可以排除这些选项。” 谢谢你抓住它!

标签: regexpredictlevenshtein-distance

解决方案


根据这个问题,有可能,你只需要对你使用的正则表达式很聪明。例如,如果您正在解析 IP:

List<string> validNextOptions = new List<string>();
string currentString = "255.3";
string newCharacter = "2";
string partialIP = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){0,3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?$";
Regex partialIpRegex = new Regex(partialIP);

if(partialIpRegex.IsMatch(currentString + newCharacter))
{
    validNextOptions.Add(newCharacter);
}

只要您朝着有效 IP 前进,此正则表达式就会返回匹配项。如果您不熟悉 regex 的工作原理,我建议您将特定的 IP 字符串发布到regex101.com之类的内容中,然后再试一试。


推荐阅读