Я использовал два отдельных словаря, чтобы связать поля источника и столбца, так как я думал, что связи только между полями источника и столбца. Пример кода предназначен для кнопки, которая заменяет текст метки при нажатии, но его можно адаптировать к любой подобной ситуации. Пока это то, что я придумал:
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace RegexTest
{
public partial class Form1 : Form
{
Dictionary<string, string> values = new Dictionary<string, string>();
Dictionary<string, string> columns = new Dictionary<string, string>();
public Form1()
{
InitializeComponent();
InitValues();
}
private void InitValues()
{
values.Add("Source1", "ABC");
values.Add("Source2", "DEF");
values.Add("Source3", "GHI");
columns.Add("Column1", "Col1");
columns.Add("Column2", "Col2");
columns.Add("Column3", "Col3");
}
private void button1_Click(object sender, EventArgs e)
{
// Create the pattern
string pattern = "[a-z1-9]+\\[Source[0-9]+\\]\\.\\[[a-z1-9]+:Column[0-9]+:[a-z1-9]+\\][a-z1-9]+";
// Create a Regex
Regex rg = new Regex(pattern);
// Get all matches
MatchCollection matchedValues = rg.Matches(label1.Text);
StringBuilder sb = new StringBuilder();
// Replace all matches
for (int count = 0; count < matchedValues.Count; count++)
{
//copy the anytext part until the source
sb.Append(matchedValues[count].Value.Substring(0, matchedValues[count].Value.IndexOf('[')));
//replace the Source parts
sb.Append(values[matchedValues[count].Value.Substring(matchedValues[count].Value.IndexOf('[') + 1,
matchedValues[count].Value.IndexOf(']') - matchedValues[count].Value.IndexOf('['))]);
//now copy in the same way the anytext after source
//split in the same way around the : and use the columns dictionary
//finally, replace the original string with the value from string builder
label1.Text = sb.ToString();
sb.Clear();
}
}
}
}
Остальные части выполнены аналогичным образом (я только заставил его найти первую часть, «источник», для части столбца это тем же). Если вам понадобится дополнительная помощь, спросите, и я отвечу как можно скорее. Я также предположил, что части anytext могут содержать только буквенно-цифровой текст, если там можно найти другие символы, я отредактирую шаблон регулярного выражения.