2015-12-30 1 views
1

Во входной строке я хочу использовать следующее Jagged Array, чтобы заменить первое значение столбца на второй столбец, добавленный \. Например, a<=bTestc<e становится a\lebTestc\lte. Как я могу достичь этого программно? Я использую шаблон Regex, определенный ниже, путем конкатенации всех первых элементов столбца массива с зубчатым контуром, используя разделитель | (Regex «OR») между каждым элементом. Я объединил элементы, взяв элементы в порядке наибольшей длины до самой короткой длины, так что, если более короткий элемент содержится в более крупном элементе, он не заменяется [Ref: Example. Я использую .NET 4.5.2Замените значение первого столбца на второе значение столбца, используя Regex в массиве с заусенцами

string[][] sSymb = { new string[] { "!=", "ne" }, new string[] { "lt=", "leq" }, new string[] { "<", "lt" }, new string[] { ">", "gt" }, new string[] { "<=", "le" }, new string[] { "gt=", "geq" }, new string[] { ">=", "ge" }, new string[] { "!in", "notin" }, new string[] { "sub", "subset" }, new string[] { "sup", "supset" } }; 
string sPattern = "gt=|!in|sub|sup|!=|<=|lt|>=|<|>"; 
Regex regex = new Regex(sPattern); 
string st = regex.Replace("a<=bcd<e", "\\$&"); //this prepends the first column element of array with \ . I need to replace the first column element with \ + second column element 
Console.WriteLine(st); 
+0

Привет! Я добавил пример того, как добиться того, что вы используете после использования массива с зубчатым контуром; но я думаю, что упорядоченный словарь является более элегантным решением. Надеюсь, это поможет! – gerrod

ответ

1

Самый простой способ для достижения этой цели было бы с помощью overload for replace which allows you to pass in a match evaluator.

string st = regex.Replace("a<=bcd<e", match => 
{ 
    var matchingSymbol = sSymb.FirstOrDefault(symbol => symbol[0] == match.Value); 
    if (matchingSymbol == null) 
     throw new Exception("Could not find symbol to exchange."); 

    return string.Concat("\\", matchingSymbol[1]); 
}); 

Также - вам нужно использовать зубчатый массив? С помощью словаря было бы намного проще.

Редактировать: Просто взглянул на ваши ключи, которые нужно согласовать, и понял, что заказ будет очень важен здесь. Вам нужно будет убедиться, что ваши записи, которые нужно заменить, упорядочены от наиболее специфичных до наименее определенных (иначе механизм регулярных выражений будет соответствовать «<», если он мог бы соответствовать «< =»).

В этом случае, Упорядоченный словарь, вероятно, будет лучшим способом для достижения этой цели:

var sSymb = new System.Collections.Specialized.OrderedDictionary 
{ 
    { "<=", "le" }, 
    { ">=", "ge" }, 
    { "!=", "ne" }, 
    { "<", "lt" }, 
    { ">", "gt" }, 
    { "gt=", "geq" }, 
    { "lt=", "leq" }, 
    { "!in", "notin" }, 
    { "sub", "subset" }, 
    { "sup", "supset" } 
}; 

var sPattern = sSymb.Keys 
    .Cast<string>() 
    .Aggregate((left, right) => string.Format("{0}|{1}", left, right)); 

Regex regex = new Regex(sPattern); 
string st = regex.Replace("a<=bcd<e", match => string.Format("\\{0}", sSymb[match.Value])); 
Console.WriteLine(st); 
+0

Я согласен с тем, что ваше упорядоченное решение словарей является лучшим решением. Для меня самая важная часть вашего решения - «что мне очень помогло» - это то, как использовать значение словаря на основе совпадающего ключа. Важен порядок элементов коллекции в ваших обоих решениях. Вопрос: В моем случае будет отсортирован список лучше, чем упорядоченный словарь? – nam

+0

Нет, упорядоченный словарь лучше, так как время поиска элементов (как правило) быстрее, поскольку словарь использует хэш хэда для извлечения его элементов. – gerrod

+0

Кроме того, если вы не реализуете пользовательский сопоставитель, отсортированный список будет упорядочивать элементы в неправильном порядке - '' <"' будет отсортирован перед '" <= "'. Поэтому, если вы используете отсортированный список для автоматического создания шаблона регулярного выражения, он никогда не найдет экземпляры '' <= "' (то же самое для ''> "' versus '"> = "') – gerrod

 Смежные вопросы

  • Нет связанных вопросов^_^