Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 25.07.2019
Сообщений: 42
1

Удаление слов в кавычках с учётом экранирования

16.08.2019, 23:12. Показов 1758. Ответов 3
Метки нет (Все метки)

Добрый вечер!
Есть у меня проблема.Мне надо удалить в строки все слова с кавычками(с учётом экранирования т.е. если в строке я нахожу \знак то я пропускаю два знака и проверяю дальше ) и вроде я это даже сделал ,но когда тестировал строку -
string test = " test "\\\\\\\\\"" hello world"; по какой-то причине она её неправильно вырезала и получилось - test \ hello world.

Код:

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
string main2 = " test \"\\\\\\\\\\\\\\\"\"  hello world";
    
    string main;
    long long nummerte = 0;
    for(size_t x=0; main2[x];++x) {
        if (main2[x] == '\\') {
            ++x;
        }else if (main2[x] == '"') {
            nummerte+=1;
        }   
 
        if(nummerte%2 != 0) {
            x+=1;
            for(size_t y=x; main2[y];++y) {
                    
                if (main2[y] == '\\') {
                    ++y;
                }else if (main2[y] == '"') {
                    x+=2;
                    nummerte+=1;
                    break;
                }   
        
                
                x++;
                    
            }
        }
        
        main+=main2[x];
    }
        
    cout << main << endl;
Добавлено через 2 часа 48 минут
И есть ли регулярное выражение для этого ?

Добавлено через 12 минут
Спасибо за ответы :/
Вот решения для тех кто столкнётся с этой проблемой:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
    #include <regex>
    
    int main ()
    {
      std::string s;
      getline(std::cin,s);
      std::regex e ("\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"");   
    
      s = std::regex_replace (s,e,"");
      std::cout << s << std::endl;
    
    
      return 0;
    }
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2019, 23:12
Ответы с готовыми решениями:

Каким образом идет поиск слов в кавычках?
Доброго времени суток! Вот вся программа #include &lt;fstream&gt; #include &lt;iostream&gt; #include...

Объединить столбец слов в одну строку, разделив слова запятыми и в кавычках
Имеется очень большой столбец слов, нужно из него сформировать массив для ЯП такого формата: array...

Удаление из списка четных атомов (с учетом подсписков)
Опишите функцию, удаляющую из списка четные атомы (с учетом подсписков). К примеру из (1 (2 3 4)...

Регулярное выражение для выбора слов с учетом дефиса
Всем знатокам доброго времени суток! Помогите! Никак не соображу, как с помощью регулярного...

3
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
17.08.2019, 10:01 2
Лучший ответ Сообщение было отмечено daneil9 как решение

Решение

Цитата Сообщение от daneil9 Посмотреть сообщение
по какой-то причине она её неправильно вырезала и получилось - test \ hello world.
Это потому что, когда у тебя встречается \ ты два раза делаешь y++ - один раз под if, потом в for. Соответственно, пропускаешь следующий символ.
Цитата Сообщение от daneil9 Посмотреть сообщение
Вот решения для тех кто столкнётся с этой проблемой:
Регулярные выражения это конечно здорово, но вот только они здесь совсем не нужны, да и работать будут примерно в сотню раз медленнее.
1
1 / 1 / 0
Регистрация: 25.07.2019
Сообщений: 42
17.08.2019, 11:36  [ТС] 3
Спасибо решил проблему так
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
string main2 = " test \"hello world!!!\"  hello world";
    
    string main;
    long long nummerte = 0;
    for(size_t x=0; main2[x];++x) {
        if (main2[x] == '\\') {
            ++x;
        }else if (main2[x] == '"') {
            nummerte+=1;
        }   
 
        if(nummerte%2 != 0) {
            x+=1;
            for(size_t y=x; main2[y];++y) {
                    
                if (main2[x] == '\\') {
                    ++x;
                 }else if (main2[y] == '"') {
                    x+=2;
                    nummerte+=1;
                    break;
                }   
        
                
                x=y;
                    
            }
        }
        
        main+=main2[x];
    }
Вы единственный человек который мне помог,спасибо!
Я тот же вопрос задавал на стеке и о боже там пришли толе троли толе ещё кто-то ,в общем ещё раз спасибо!)
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
17.08.2019, 12:50 4
Лучший ответ Сообщение было отмечено daneil9 как решение

Решение

Цитата Сообщение от daneil9 Посмотреть сообщение
Спасибо решил проблему так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main()
{
    const char _s[] = " test \"\\\\\\\\\\\\\\\"\"  hello world";
    std::string s2;
    bool skip = false;
    for (const auto* p = _s; *p; ++p)
    {
        if (*p == '"')
            skip = !skip;
 
        if (*p == '\\')
        {
            ++p;
            if (*p == 0)
                break;
        }
        
        if (!skip)
            s2 += *p;
    }
 
    std::cout << s2 << std::endl;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2019, 12:50

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Поиск слов по маске в строке, их удаление, сортировка оставшихся слов
Доброго времени суток. Помогите, пожалуйста, реализовать задачу. нужно из текстового файла считать...

Формирование массива слов и удаление из текста слов, которые встречаются заданное число раз
Доброго времени суток. Помогите, пожалуйста! Задача заключается в том, что нужно из введенного...

Объединить введенные строки с учетом разделения слов точкой с запятой и пробелом
Составить программу, которая: • вводит три слова в разные строковые переменные; • объединяет...

Свести таблицу с учетом регистра (удаление дубликатов, слияние столбцов, Excel)
Добрый день. Я создаю словарь украинского языка для электронной книги Amazon Kindle. Для этого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.