Замена запятых в строке скобками и запятыми, если они не существуют - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь манипулировать и очищать строку столбцов базы данных следующим образом.

Пример Исходная строка (и):

[foo],[bar],baz
[foo],bar,[baz]
[foo],[bar,[baz]
[foo],bar],[baz]
foo,bar,baz

(и т. Д.)

Ожидаемый результат:

[foo],[bar],[baz]

Я попытался выполнить следующие подстановки регулярных выражений для строки:

        string columnString = "[foo],[bar],baz";

        if (!Regex.IsMatch(columnString, @"^\[.*"))
        {
            columnString = string.Concat("[", columnString);}
        if (!Regex.IsMatch(columnString, @"^.*\]$"))
        {
            columnString = string.Concat(columnString,"]");
        }
        while (!Regex.IsMatch(columnString, @"^.*\],.*$"))
        {
            columnString = Regex.Replace(columnString, @",", @"],");}
        while (!Regex.IsMatch(columnString, @"^.*,\[.*$"))
        {
            columnString = Regex.Replace(columnString, @"\],", @"],[");
        }

Хотя это исправляет начальные и конечные скобки, это (очевидно)не имеет дело с запятыми, где уже есть совпадение в строке.

Может кто-нибудь предложить метод, который бы убрал это (это не должно быть регулярное выражение).

Приветствия

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Если вы хотите использовать регулярное выражение, вот ответ:

var input = "[foo],bar,[baz]";
var regex = new Regex("((\\[?)((foo)|(bar)|(baz))(\\]?))");
var result = regex.Replace(input, "[$3]");

Пожалуйста, смотрите: https://dotnetfiddle.net/Afnn3m

0 голосов
/ 12 февраля 2019

Я предлагаю решение для разделения и восстановления строк:

var result = string.Join(
    ",", 
    s.Split(',') // split with commas
        .Select(x => !x.StartsWith("[") && !x.EndsWith("]") ? $"[{x}]" : x ) // add [ ] to items not starting and ending with [ ]
);

См. C # демо :

var strs = new List<string> { "[foo],[bar],baz", "[foo],bar,[baz]", "foo,bar,baz" };
foreach (var s in strs)
{
    var result = string.Join(",", s.Split(',').Select(x => !x.StartsWith("[") && !x.EndsWith("]") ? $"[{x}]" : x ));
    Console.WriteLine(result);
}

Вывод:

[foo],[bar],[baz]
[foo],[bar],[baz]
[foo],[bar],[baz]

Обновлено

Поскольку могут быть элементы с [ в начале или ] в конце, вы можете использовать

var result = string.Join(
    ",", 
    s.Split(',')
        .Select(x => !x.StartsWith("[") || !x.EndsWith("]") ? 
            $"[{Regex.Replace(x, @"^\[|]$", "")}]" : x 
    )
);

См. это C # демо .Результат:

[foo],[bar],[baz],[test]
[foo],[bar],[baz],[test]
[foo],[bar],[baz]

Обратите внимание, что Regex.Replace(x, @"^\[|]$", "") удаляет [ в начале и ] в конце строки.

0 голосов
/ 12 февраля 2019
string str = "[foo],[bar],baz";
str = "[" + str.Replace("[", "").Replace("]", "").Replace(",", "],[") + "]";

Используйте StringBuilder, если это возможно.Я только что дал вам идею, используя String класс.

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