我目前正在 C# 和 WPF 中創建語法熒光筆。到目前為止它有效,但感覺我可以更好地獲得命名組的價值。
這是一個帶有示例 RegEx 的示例,說明我現在是如何做的:
private void Match(string r)
{
var matches = Regex.Matches(r, @"(?<duplicateWord>\w )\s\k<duplicateWord>\W(?<nextWord>\w )", RegexOptions.Multiline);
for (int i = 0; i < matches.Count; i )
{
if (matches[i].Success)
{
for (int j = 0; j < matches[i].Groups.Count; j )
{
if (matches[i].Groups[j].Success)
{
switch (matches[i].Groups[j].Name)
{
case "duplicateWord":
ProcessDuplicate(matches[i].Groups[j].Value);
break;
case "nextWord":
ProcessNext(matches[i].Groups[j].Value);
break;
default:
break;
}
}
}
}
}
}
當然,這不是我使用的 RegEx,我有大約 10 個組。所以我希望有更好的解決方案。另一個想法是使用不同的正則運算式,但這很可能會進一步降低性能。
謝謝大家。
uj5u.com熱心網友回復:
您的組不是可選的,因此如果匹配成功,它們將始終是成功的。此外,您實際上不必迭代組。只需使用索引器直接訪問它們。
您可以通過撰寫如下代碼來顯著簡化代碼:
foreach (Match match in matches.Cast<Match>().Where(m => m.Success))
{
ProcessDuplicate(match.Groups["duplicateWord"].Value);
ProcessNext(match.Groups["nextWord"].Value);
}
如果某些組是可選的,您可以Success僅檢查這些組的屬性:
if (match.Groups["someGroup"].Success)
SomeMethod(match.Groups["someGroup"].Value);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462711.html
標籤:C#
上一篇:C#linq回傳串列的每第n行
