有没有办法使用RegEx.Matches来查找并将匹配的值以不同(字母)顺序写回?目前我有以下代码:
所以,为了适应这种情况,我不得不更改一些代码: 在ReplaceCallbackLinq中:
并将正则表达式定义为:
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的解决方案,它为我提供了基础,让我可以继续前进。不幸的是,我并不擅长正则表达式,但最终我得到了一段代码,我相信它仍有改进空间:
...
//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*)+",