Методы обрезки строк в C++

Указатели в C++ Программирование и разработка

Обрезка строки означает удаление пробелов спереди и сзади строки. Следующий вопрос: что такое пробелы? Ниже приведен список пробелов в строке:

  • ’’ или ’\ 040′: пробел при нажатии клавиши пробела
  • ’\ n’: перевод строки
  • ’\ r’: возврат каретки
  • ’f’: подача формы
  • ’\ t’: горизонтальная табуляция
  • ’\ v’: вертикальная табуляция

В C ++ нет функции обрезки строки. В компьютерном программировании есть предмет, называемый регулярными выражениями, сокращенно регулярное выражение. У этого предмета есть схемы, которые позволяют программисту искать подстроку в целевой строке и заменять найденную подстроку. Найденную подстроку ничем нельзя заменить и, таким образом, стереть.

Идею поиска и замены без ничего можно использовать для обрезки строки. Поэтому ищите все символы пробелов перед строкой и все символы пробелов за строкой и заменяйте их ничем. К счастью, в C ++ есть библиотека регулярных выражений, которую для этого нужно включить в программу.

Резюме регулярных выражений

Regex

Рассмотрим строку:

    «This is it for the show»

Первые четыре символа этой строки образуют подстроку «Это». Последние четыре символа строки образуют последнюю подстроку «show».

Теперь вся строка называется целевой строкой или просто целью. Подстрока «Это» или «показать» называется регулярным выражением или просто регулярным выражением.

Matching

Если «Это» найдено и находится в цели, то считается, что сопоставление произошло. Если «шоу» ищется и обнаруживается, то считается, что совпадение произошло. Сопоставление происходит для любой целевой строки при нахождении подстроки. Подстроку можно заменить. Например, «Это» можно заменить на «Здесь», а «показать» можно заменить на «игра», чтобы получить новую цель,

    «Here is it for the game»

Если первое и последнее слова вообще не нужны, их можно было заменить ничем, чтобы иметь,

    » is it for the «

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

Pattern

Тупая подстрока («Это» или «показать»), как показано выше, представляет собой простой узор. Рассмотрим следующую цель:

    «Hey, that is a bat on the middle of the road.»

Программист может захотеть узнать, крыса это, кошка или летучая мышь, поскольку эти три слова похожи по звучанию. Ему нужен образец для определения слова «кошка», «крыса» или «летучая мышь». Обратите внимание, что каждое из этих слов заканчивается на «в», но начинается на «b», «c» или «r». Шаблон, соответствующий любому из этих трех слов, выглядит так:

    [bcr]at

Это означает соответствие «b», «c» или «r», за которым следует «at».

Repetition

x *: означает совпадение «x» 0 или более раз, т. Е. Любое количество раз.

Matching Examples

Следующая программа производит сопоставление для «летучей мыши» в целевой строке, используя объект регулярного выражения reg («[bcr] at»), шаблон которого равен [bcr] at.

    #include <iostream>
#include <regex>
using namespace std;

int main()
{

regex reg(«[bcr]at»);
if (regex_search(«Hey, that is a bat on the middle of the road.», reg))
cout << «matched» << endl;
else
cout << «not matched» << endl;

return 0;
}

Результат: совпадает.

Библиотека регулярных выражений включена в «#include ». Объект регулярного выражения создается с помощью оператора

    regex reg(«[bcr]at»);

[/ cc]

Функция regex_search () из библиотеки принимает здесь два аргумента. Первая — целевая строка. Второй — объект регулярного выражения. Шаблон, [bcr] при совпадении «летучая мышь», и поэтому функция regex_search () вернула true. В противном случае вернулось бы false.

Следующая программа иллюстрирует совпадение шаблона, bo * k для «книги»:

    #include <iostream>
#include <regex>
using namespace std;

int main()
{

regex reg(«bo*k»);
if (regex_search(«the book is good.», reg))
cout << «matched» << endl;
else
cout << «not matched» << endl;

return 0;
}

Результат: совпадает. o * означает совпадение «o», ноль или более раз. На самом деле он дважды совпадал с буквой «о» в «книге».

Соответствие началу целевой строки

Чтобы соответствовать началу целевой строки, шаблон должен начинаться с символа ^. Следующая программа сопоставляет «Это» в начале целевой строки «Это для шоу».

    #include <iostream>
#include <regex>
using namespace std;

int main()
{
regex reg(«^This»);
if (regex_search(«This is it for the show», reg))
cout << «matched» << endl;
else
cout << «not matched» << endl;

return 0;
}

Результат: совпадает. Обратите внимание на литерал регулярного выражения «^ This».

Соответствие концу целевой строки

Чтобы соответствовать концу целевой строки, шаблон должен заканчиваться символом $. Следующая программа сопоставляет «show» в конце целевой строки «This is it for the show».

    #include <iostream>
#include <regex>
using namespace std;

int main()
{

regex reg(«show$»);
if (regex_search(«This is it for the show», reg))
cout << «matched» << endl;
else
cout << «not matched» << endl;

return 0;
}

Результат: совпадает. Обратите внимание на литерал регулярного выражения «show $».

Сопоставление альтернатив

Для сопоставления начальной или конечной подстроки | метасимвол должен разделять начальный и конечный паттерны в общем паттерне. Следующая программа иллюстрирует это:

    #include <iostream>
#include <regex>
using namespace std;

int main()
{

regex reg(«^This|show$»);
if (regex_search(«This is it for the show», reg))
cout << «matched» << endl;
else
cout << «not matched» << endl;

return 0;
}

Результат: совпадает. Обратите внимание на литерал регулярного выражения «^ This | show $».

Теперь функция regex_search () обычно соответствует первой опции шаблона и останавливается. Этот случай соответствует «Это» в начале цели и останавливается, не продолжая сопоставление «шоу» в конце цели.

К счастью, функция regex_replace () библиотеки регулярных выражений C ++ заменяет все альтернативы в любом месте целевой строки в своем режиме по умолчанию. Итак, эта функция regex_replace () подходит для обрезки строк. То есть ищите полное пустое пространство перед строкой и ищите полное пустое пространство за строкой и заменяйте оба значения ничем.

Search и Replace

Следующая программа заменяет первое и последнее слова целевой строки словом «Dog»:

    #include <iostream>
#include <regex>
#include <string>
using namespace std;

int main()
{
char str[] = «This is it for the show»;
string newStr = regex_replace(str, regex(«^This|show$»)«Dog»);
cout << newStr << endl;

return 0;
}

Результат:

    Dog is it for the Dog

Программа использует функцию regex_replace (). Первый аргумент — целевая строка. Второй аргумент — это объект регулярного выражения. Третий аргумент — заменяющий строковый литерал. Возвращаемая строка — это измененный строковый объект. Поэтому пришлось включить строковый класс.

Trimming Proper

Рассмотрим строку:

    «\t I want democracy! \n«

Два символа пробела, ’\ t’ и ’’, находятся перед полезным текстом. Еще два символа пробела, ’’ и ’\ t’, находятся за полезным текстом. Обрезка означает удаление всех символов пробела перед текстом и удаление всех символов пробела позади текста.

Для соответствия первым двум символам здесь используется шаблон «\ t | », То есть ’\ t’ или один пробел. Для соответствия последним двум символам здесь используется шаблон «| \ t», то есть один пробел или «\ t». Однако программист обычно не знает, из чего состоит конкретное белое пространство. Поэтому лучше всего учесть все возможные комбинации для всех символов пробела с шаблоном «| \ t | \ n | \ r | \ v | \ f». Обратите внимание на использование оператора OR регулярного выражения, |.

Проблема все еще существует. Шаблон «| \ t | \ n | \ r | \ v | \ f» будет соответствовать только одному символу пробела в начале строки и будет соответствовать только одному символу пробела в конце строки. Это из-за | операторы. Таким образом, этот шаблон необходимо изменить, чтобы он соответствовал всем символам пробела в начале строки или в конце строки. Таким образом, любой возможный символ должен соответствовать синтаксису x * ноль или более раз. И окончательный шаблон для сопоставления последовательных пробельных символов:

    «[ |\t|\n|\r|\v|\f]*»

Чтобы сопоставить последовательные символы пробела в начале строки, используйте,

    «^[ |\t|\n|\r|\v|\f]*»

Обратите внимание на наличие и положение ^.

Чтобы сопоставить последовательные символы пробела в конце строки, используйте,

    «[ |\t|\n|\r|\v|\f]*$»

Обратите внимание на наличие и положение $. И чтобы сопоставить последовательные символы пробела в начале ИЛИ в конце строки, используйте,

    «^[ |\t|\n|\r|\v|\f]*|[ |\t|\n|\r|\v|\f]*$»

Обратите внимание на использование | в середине общего рисунка.

После сопоставления все символы пробела заменяются ничем, то есть «„, пустой строкой. Помните, что функция regex_replace () заменяет все вхождения подстрок, соответствующих шаблону, по всей целевой строке.

Следующая программа обрезает целевую строку: „Я хочу демократии! \ n „на“ Я хочу демократии! “ :

    #include <iostream>
#include <regex>
#include <string>
using namespace std;

int main()
{
char str[] = «\t I want democracy! \n«;
string retStr = regex_replace(str, regex(«^[ |\t|\n|\r|\v|\f]*|[ |\t|\n|\r|\v|\f]*$»)«»);
cout << retStr << endl;

return 0;
}

Результат:

    I want democracy!

Заключение

Обрезка строки означает удаление пробелов спереди и сзади строки. Пробел состоит из символов пробела. Символы пробела: ’’, ’\ n’, ’\ r’, ’f’, ’\ t’ ’\ v’. Чтобы обрезать строку в C ++, включая библиотеку регулярных выражений, и использовать функцию regex_replace () для поиска и замены. Замените любые пробелы в начале и / или в конце строки пустой строкой.

Читайте также:  React State: основы
Оцените статью
bestprogrammer.ru
Добавить комментарий