【发布时间】:2017-01-01 05:27:15
【问题描述】:
给定一个正则表达式模式的数字列表,按该数值中的最后 4 个数字对它们进行排序。
我有一个正则表达式(电话号码)模式列表,我正在尝试按最后 4 个字符对它们进行排序。以下是电话号码示例:
8062
\+13066598273
4083100
408320[0-3]
408320[4-6]
752[234569]
\+13066598305
8059
我想按最后 4 个数字对这些数字重新排序,以便最终得到如下列表:
4083100
408320[0-3]
408320[4-6]
752[234569]
8059
8062
\+13066598273
\+13066598305
现在,如果我的模式只是数字,我可以在 SQL 或我的 MVC C# 项目中轻松地对它们进行排序。在 SQL 中,我可以使用 ORDER BY RIGHT(pattern, 4),或者在 C# MVC 中,我可以使用 patterns = patterns.OrderByDescending(s => s.Substring( ...等等...)).
模式有点困难。括号算作字符,因此按最后 4 个字符排序也不起作用。
C#、MVC 或 SQL 中是否有任何内置实用程序可让我将正则表达式模式转换为最大可能匹配?
- 给定一个正则表达式模式,返回与我的条件匹配的最大可能匹配正则表达式。例如,如果我有模式 4[12]00[1-3],我将有 6 个可能的结果:41001、41002、41003、42001、42002、42003。然后我可以获得最大的数字,并使用用于在我的原始正则表达式列表中排序。
- 正则表达式不包含 * 或 + 等可能导致无限组合的特殊字符。
- 可能有一个 C# 库完全符合我的要求,对正则表达式模式字符串进行排序。
编辑:
我已经接受了 Diego 的回答,但我花了一些时间来理解它。对于其他想知道它在做什么的读者,这就是我认为 Diego 正在做的事情:
- 创建一个整数范围,从 9999 开始,一直到 0。[9999]、[9998]、[9997]...[0]。
- 用单个字符替换字符串的正则表达式部分。例如,“500[1-5]”会变成“500X”,或者“20[1-9]00[89]”会变成“20X00X”,以此类推。
-
获取“最后”4 个字符 + 正则表达式字符的长度。
var len = lastNChars + pattern.Length - Regex.Replace(pattern, @"\[[^\]]+\]", "X").Length;因此对于模式 20[1-9]00[89],上述公式转换为“len = 4 + 13 - 6”,即 11。
使用上面的 len 变量,得到一个表示电话号码“最后”4 个数字的子字符串,即使是正则表达式字符。原始字符串 = "20[1-9]00[89]",而新的子字符串 = "[1-9]00[89]"(现在 20 没有了)
- 枚举数组值并将其与子字符串正则表达式模式进行比较。 [9999] 不匹配正则表达式模式,[9998] 不匹配... [9997]不匹配……啊哈! 9009场比赛!我得到的第一场比赛是最大可能的正则表达式匹配,这就是我想要的。
- 因此,每个正则表达式模式都已转换为其最大可能的匹配模式。现在我们可以使用 C#/LINQ/其他内置方法,这些方法可以为我们按这些子正则表达式匹配进行排序!
感谢上帝,我只处理数字。如果我试图对实际上是单词/具有字母字符的正则表达式模式进行排序,那将更加困难,并且该数组会更大(我认为)。
【问题讨论】: