Объединить соседние символы специального символа "-" - PullRequest
6 голосов
/ 08 февраля 2012

Я разрабатываю приложение, используя c # .net, в котором мне нужно, чтобы, если ввод, введенный пользователем, содержал символ '-' (дефис), то я хотел бы, чтобы непосредственные соседи дефиса (-) были объединены, например, если пользователь вводит

A-B-C then i want it to be replaced with ABC
AB-CD then i want it to be replaced like BC
ABC-D-E then i want it to be replaced like CDE
AB-CD-K then i want it to be replaced like BC and DK both separated by keyword and

после получения я должен подготовить запрос к базе данных.

Надеюсь, я прояснил проблему, но если понадобится больше разъяснений, дайте мне знать. Любая помощь будет оценена по достоинству.

Спасибо, Devjosh

Ответы [ 4 ]

4 голосов
/ 08 февраля 2012

Использование:

string[] input = {
                        "A-B-C",
                        "AB-CD",
                        "ABC-D-E",
                        "AB-CD-K"
                    };

var regex = new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled);

var result = input.Select(s => string.Concat(regex.Matches(s)
    .Cast<Match>().Select(m => m.Value)));

foreach (var s in result)
{
    Console.WriteLine(s);
}

Вывод:

ABC
BC
CDE
BCDK
3 голосов
/ 08 февраля 2012

Не проверено, но это должно сработать, или, по крайней мере, приведет вас в правильном направлении.

private string Prepare(string input)
{
    StringBuilder output = new StringBuilder();
    char[] chars = input.ToCharArray();
    for (int i = 0; i < chars.Length; i++)
    {
        if (chars[i] == '-')
        {
            if (i > 0)
            {
                output.Append(chars[i - 1]);
            }
            if (++i < chars.Length)
            {
                output.Append(chars[i])
            }
            else
            {
                break;
            }
        }
    }
    return output.ToString();
}

Если вы хотите, чтобы каждая пара формировала отдельный объект в массиве, попробуйте следующеекод:

private string[] Prepare(string input)
{
    List<string> output = new List<string>();
    char[] chars = input.ToCharArray();
    for (int i = 0; i < chars.Length; i++)
    {
        if (chars[i] == '-')
        {
            string o = string.Empty;
            if (i > 0)
            {
                o += chars[i - 1];
            }
            if (++i < chars.Length)
            {
                o += chars[i]
            }
            output.Add(o); 
        }
    }
    return output.ToArray();
}
1 голос
/ 08 февраля 2012

Вы даже можете решить это с помощью одной строки (хотя и немного некрасиво):

String.Join(String.Empty, input.Split('-').Select(q => (q.Length == 0 ? String.Empty : (q.Length > 1 ? (q.First() + q.Last()).ToString() : q.First().ToString())))).Substring(((input[0] + input[1]).ToString().Contains('-') ? 0 : 1), input.Length - ((input[0] + input[1]).ToString().Contains('-') ? 0 : 1) - ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-') ? 0 : 1));

сначала он разбивает строку на массив на каждом '-', затем объединяет только первый и последний символ каждой строки (или только единственный символ, если есть только один, и оставляет пустую строку, если ничего нет там), а затем он объединяет полученное перечисление в строку. Наконец, мы удаляем первую и последнюю букву, если они не находятся в нужном диапазоне.

Я знаю, это уродливо, я просто говорю, что это возможно ..

Возможно, лучше просто использовать простое

new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled)

, а затем работать с этим ..

РЕДАКТИРОВАТЬ @ Кирилл Полищук был быстрее .. его решение должно работать ..

РЕДАКТИРОВАТЬ 2

После того, как Вопрос был обновлен, вот фрагмент кода, который должен помочь:

        string input = "A-B-C";
        string s2;
        string s3 = "";
        string s4 = "";
        var splitted = input.Split('-');
        foreach(string s in splitted) {
            if (s.Length == 0)
                s2 = String.Empty;
            else
                if (s.Length > 1)
                    s2 = (s.First() + s.Last()).ToString();
                else
                    s2 = s.First().ToString();
            s3 += s4 + s2;
            s4 = " and ";
        }
        int beginning;
        int end;
        if (input.Length > 1)
        {
            if ((input[0] + input[1]).ToString().Contains('-'))
                beginning = 0;
            else
                beginning = 1;
            if ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-'))
                end = 0;
            else
                end = 1;
        }
        else
        {
            if ((input[0]).ToString().Contains('-'))
                beginning = 0;
            else
                beginning = 1;
            if ((input[input.Length - 1]).ToString().Contains('-'))
                end = 0;
            else
                end = 1;
        }
        string result = s3.Substring(beginning, s3.Length - beginning - end);

Это не очень элегантно, но должно работать (не проверено, хотя ..). он работает почти так же, как вышеописанный однострочный ...

1 голос
/ 08 февраля 2012

Поправьте меня, если я ошибаюсь, но, безусловно, все, что вам нужно сделать, это удалить '-'?

как это:

"A-B-C".Replace("-","");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...