RegEx.Matches를 사용하여 일치하는 값을 찾아 다른 순서로 (알파벳순으로) 다시 쓸 수있는 방법이 있습니까?C# 정렬 및 다시 넣기 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 솔루션을 통해 내가 계속 전진 할 수있는 기초를 갖게되었습니다. 나는 슬프게 정규식에 너무 좋은 아니에요,하지만 난 여전히 개선 될 수 있다고 믿는 그 코드와 함께 종료 :
...
//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";
}
이
업데이트 : 인덱스 필드가 경우도 있습니다 때 ReplaceCall에 :
KEY `idx3` (`app_property_definition_id`,`value`(255),`audit_current`),
너무, 너무,이 경우 일치하기 위해 나는 몇 가지 코드를 변경했다 : 255 개 문자보다 긴 MySQL은 255 인덱스를 트림과 같이 씁니다 backLinq :
select item.Value.Trim().Replace("`),", "`)")
및 정규식 정의 :
foreach (Match match in keys.Cast<Match>().OrderBy(m => m.Value))
당신이 원하는 게 무엇을 : 나는 완전히 질문을 이해하지만,에 foreach 문을 변경 않을 경우
@"[ ]+(KEY `[\w]+` \([\w`(\(255\)),]+\),?\s*)+",
감사합니다.이 솔루션을 사용하면 계속 나아갈 수있는 기초를 얻을 수있었습니다. 슬프게도 RegEx에 능숙하지는 않지만, 여전히 향상 될 수 있다고 생각하는 코드로 끝났습니다. –