有没有办法使用 RegEx.Matches 来查找和写回匹配的值,但以不同的(字母顺序)顺序?
现在我有类似的东西:
var pattern = @"(KEY `[\w]+?` \(`.*`*\))";
var keys = Regex.Matches(line, pattern);
Console.WriteLine("\n\n");
foreach (Match match in keys)
{
Console.WriteLine(match.Index + " = " + match.Value.Replace("\n", "").Trim());
}
但我真正需要的是获取 table.sql 转储并按字母顺序对现有索引进行排序,示例代码:
line = "...PRIMARY KEY (`communication_auto`),\n KEY `idx_current` (`current`),\n KEY `idx_communication` (`communication_id`,`current`),\n KEY `idx_volunteer` (`volunteer_id`,`current`),\n KEY `idx_template` (`template_id`,`current`)\n);"
谢谢J
更新: 谢谢,m.buettner 解决方案给了我可以用来继续前进的基础知识。遗憾的是,我不太擅长 RegEx,但我最终得到了我认为仍然可以改进的代码:
...
//sort INDEXES definitions alphabetically
if (line.Contains(" KEY `")) line = Regex.Replace(
line,
@"[ ]+(KEY `[\w]+` \([\w`,]+\),?\s*)+",
ReplaceCallbackLinq
);
static string ReplaceCallbackLinq(Match match)
{
var result = String.Join(",\n ",
from Capture item in match.Groups[1].Captures
orderby item.Value.Trim()
select item.Value.Trim().Replace("),", ")")
);
return " " + result + "\n";
}
更新: 还有一种情况,索引字段长于 255 个字符 mysql 将索引修剪到 255 并这样写:
KEY `idx3` (`app_property_definition_id`,`value`(255),`audit_current`),
因此,为了匹配这种情况,我也必须更改一些代码:在 ReplaceCallbackLinq 中:
select item.Value.Trim().Replace("`),", "`)")
和正则表达式定义:
@"[ ]+(KEY `[\w]+` \([\w`(\(255\)),]+\),?\s*)+",