powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Удалить пробелы между заданной парой символов. Желательно в один проход.
10 сообщений из 10, страница 1 из 1
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830470
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например из:
"text text text [249 ].text [ 406 ] [ dd"
получить:
"text text text [249].text [406] [ dd"

в один проход не получается
хотя можно индексы пробельных символов запоминать в список
потом удалять и уменьшать индексы следующих пробелов

какие идеи?
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830481
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830490
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
/// <summary>
        /// удаляет пробелы между в диапазоне между заданными символами, например "ddd [249]. [ 406 ]"
        /// </summary>        
        public static string GetClearDummyStr(string str, char charStart, char charEnd)
        {
            // возвращает индекс закрывающего символа, при условии что встречаются только пробелы или числа
            int CheckCharEnd(string s, int strtIndex)
            {
                bool containsSpace = false;

                for (int i = strtIndex; i < s.Length; i++)
                {
                    // если посторонний символ
                    if (!(char.IsNumber(s[i]) || s[i] == ' ' || s[i] == charStart || s[i] == charEnd))
                    {
                        return -1;
                    }
                    // если встретили пробел
                    if (s[i] == ' ')
                    {
                        containsSpace = true;
                    }
                    // если встречали пробел и встретили конечный символ
                    if (s[i] == charEnd && containsSpace)
                    {
                        return i;
                    }
                }
                return -1;
            }
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == charStart)
                {
                    int j = CheckCharEnd(str, i);
                    // если стОит анализировать диапазон
                    if (j > i)
                    {
                        string oldSub = Slice(str, i, j + 1);
                        string newSub = oldSub.Replace(" ", String.Empty);
                        str = str.Replace(oldSub, newSub);
                        str = GetClearDummyStr(str, charStart, charEnd);
                    }
                }

            }
            return str;
        }
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830491
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде воркает)
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830492
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправил рекурсивный вызов
Срочно патентую!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
/// <summary>
        /// удаляет пробелы между в диапазоне между заданными символами, например "ddd [249]. [ 406 ]"
        /// </summary>        
        public static string GetClearDummyStr(string str, char charStart, char charEnd)
        {
            // возвращает индекс закрывающего символа, при условии что встречаются только пробелы или числа
            int CheckCharEnd(string s, int strtIndex)
            {
                bool containsSpace = false;

                for (int i = strtIndex; i < s.Length; i++)
                {
                    // если посторонний символ
                    if (!(char.IsNumber(s[i]) || s[i] == ' ' || s[i] == charStart || s[i] == charEnd))
                    {
                        return -1;
                    }
                    // если встретили пробел
                    if (s[i] == ' ')
                    {
                        containsSpace = true;
                    }
                    // если встречали пробел и встретили конечный символ
                    if (s[i] == charEnd && containsSpace)
                    {
                        return i;
                    }
                }
                return -1;
            }
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == charStart)
                {
                    int j = CheckCharEnd(str, i);
                    // если стОит анализировать диапазон
                    if (j > i)
                    {
                        string oldSub = Slice(str, i, j + 1);
                        string newSub = oldSub.Replace(" ", String.Empty);
                        str = str.Replace(oldSub, newSub);
                        return GetClearDummyStr(str, charStart, charEnd);
                    }
                }

            }
            return str;
        }
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830516
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
private const char _openChar = '[';
private const char _closeChar = ']';

private static Action<char> _state;

private static void Main(string[] args)
{
    var input = "text text text [249 ].text [ 406 ] [ dd";

    _state = S0;

    foreach (var @char in input)
    {
        _state(@char);
    }
}

private static void S0(char @char)
{
    if (@char == _openChar)
    {
        Console.Write(@char);
        _state = S1;
    }
    else
    {
        Console.Write(@char);
        // _state = S0;
    }
}

private static void S1(char @char)
{
    if (@char == _closeChar)
    {
        Console.Write(@char);
        _state = S0;
    }
    else if (char.IsWhiteSpace(@char))
    {
        // do nothing
        // _state = S1;
    }
    else
    {
        Console.Write(@char);
        // _state = S1;
    }
}
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830520
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного накосячил с окончанием строки. Правильно вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
private const char _openChar = '[';
private const char _closeChar = ']';

private static Action<char> _state;
private static StringBuilder _buffer;

private static void Main(string[] args)
{
    var input = "text text text [249 ].text [ 406 ] [ dd";

    _state = S0;
    _buffer = new StringBuilder();

    foreach (var @char in input)
    {
        _state(@char);
    }

    Console.Write(_buffer);
}

private static void S0(char @char)
{
    if (@char == _openChar)
    {
        Console.Write(@char);
        _state = S1;
    }
    else
    {
        Console.Write(@char);
        // _state = S0;
    }
}

private static void S1(char @char)
{
    if (@char == _closeChar)
    {
        foreach (var c in _buffer.ToString()
            .Where(_c => !char.IsWhiteSpace(_c)))
        {
            Console.Write(c);
        }

        Console.Write(@char);
        _buffer.Clear();
        _state = S0;
    }
    else
    {
        _buffer.Append(@char);
        // _state = S1;
    }
}
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39830577
listtoview
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

мой способ лучше ИМХО)
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39840269
Varcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
listtoview,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
string source = " aa aa[ bb  ]  cc";

bool inSquare = false;
string result = string.Join("", source.Where(x =>
{
    if (x == '[' || x == ']')
        inSquare = !inSquare;
    return !inSquare || x != ' ';
}));
...
Рейтинг: 0 / 0
Удалить пробелы между заданной парой символов. Желательно в один проход.
    #39840277
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
Regex.Replace(Regex.Replace(ss, @"\[\s+", "["), @"\s+\]", "]")
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Удалить пробелы между заданной парой символов. Желательно в один проход.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]