C # Заменить регулярным выражением нескольких пар (для CLR SQL Server) - PullRequest
0 голосов
/ 26 апреля 2019

Я только что реализовал эту простую функцию CLR с C # для моего SQL Server, но обнаружил, что мне нужно заменить еще 20 пар, и некоторые замены выполняются в конце строки, поэтому я предполагаю, что это должно быть Regex ( ?).
Что бы было неплохо организовать этот код, ниже приведен пример с одной парой. Я новичок в C #, возможно, стоит подумать о том, чтобы поместить эти пары в массив и цикл, но, вероятно, есть лучшее решение, которое я могу обойти без цикла, как в Ruby. В то же время я могу повторить этот блок также 20 раз, если это будет быстрее.)

Tx Я вижу какой-то метод со словарем, но получил некоторые ошибки. Как сказать C #, что это может быть только часть строки, а не вся строка?

select top 1 CLR_AddressM('alpha lane') from sys.objects

System.Collection.Generic.KeyNotFoundException: Указанный ключ отсутствует.

using System;
using System.Data.SqlTypes;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Linq;


namespace CLR_Functions
{
    public partial class CLRFunctions
    {    [SqlFunction( DataAccess = DataAccessKind.None, FillRowMethodName = "MyFillRowMethod"   , IsDeterministic = true)        ]

          public static string AddressM(string AddressIn)
        {
            if (string.IsNullOrEmpty(AddressIn)) return AddressIn;

              var xmlEntityReplacements = new Dictionary<string, string> {
 { "Lane$", "Ln" }, { "Avenue", "Ave" }, { "Boulevard", "Blvd" },{ "Street", "St;" }, { ".", "" }                                                                                            };

    // Create an array and populate from the dictionary keys, then convert the array 
    // to a pipe-delimited string to serve as the regex search values and replace
    return Regex.Replace(AddressIn, string.Join("|", xmlEntityReplacements.Keys.Select(k => k.ToString()).ToArray()), m => xmlEntityReplacements[m.Value]);
}    }     }

1 Ответ

1 голос
/ 27 апреля 2019

Исключение "KeyNotFound" означает, что вы пытаетесь получить что-то из словаря, которого там нет.

Когда вы вызываете xmlEntityReplacements [m.Value], m.Value отсутствует в словаре - в случае регулярного выражения "Lane $" m.Value будет просто "Lane", поэтому может быть, поэтому.

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

    public static string AddressM(string addressIn)
    {
        var xmlEntityReplacements = new Dictionary<string, string> {
         { "Lane$", "Ln" }, { "Avenue", "Ave" }, { "Boulevard", "Blvd" },{ "Street", "St;" }
            //. would match all chars ...
            , { "\\.", "" }  
        };

        foreach(var kv in xmlEntityReplacements){       
            addressIn = Regex.Replace(addressIn, kv.Key, m => xmlEntityReplacements[kv.Key],
// You might also want RegexOptions.IgnoreCase here
 RegexOptions.Compiled);

        }

        return addressIn;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...