Разделить строку

У меня есть эта строка:

https://insights.ubuntu.com/feed/">Canonical

Как получить, используя функцию, только:

https://insights.ubuntu.com/feed/

до последней косой черты (удаление ">Canonical)?

introducir la descripción de la imagen aquí

0
задан 17.01.2017, 05:36
3 ответа

Ввиду того, что единственной, что интересует тебя, является цепь перед двойными кавычками (") у тебя есть пара выборов.

Копировать в другой цепи:

const std::string input = "https://insights.ubuntu.com/feed/\">Canonical";
std::string resultado;

std::copy_n(input.begin(), input.find('\"'), std::back_inserter(resultado));

С предыдущим кодом ты скопируешь в std::string resultado вся первоначальная цепь (input) до двойных кавычек.

Изменять первоначальную цепь:

Если вместо того, чтобы копировать контент в другой цепи, ты предпочитаешь изменять первоначальную цепь, ты можешь делать это так:

std::string input = "https://insights.ubuntu.com/feed/\">Canonical";
input.resize(input.find('\"'));

С предыдущим кодом, откажется контент input вслед за двойными кавычками оставляя цепь как ты нуждаешься в ней.

2
ответ дан 24.11.2019, 11:35

Смотри это возможное решение, где мы получаем положение слова, которое нужно разграничивать, и на основании строителя класса string мы копируем с положения нуль до нее n положение.

string filtrarString(string s,string delimitador)
{
    int posDelimitador=s.find(delimitador);
    return string(s,0,posDelimitador);
}


int main()
{

    string url="https://insights.ubuntu.com/feed/>Canonical";
    cout<<filtrarString(url,">Canonical")<<endl;


    return 0;
}
1
ответ дан 24.11.2019, 11:35

Если ты можешь быть позволено составлять со стандартом C ++ 11 или последующий ты можешь использовать книжный магазин regex чтобы вводить регулярные выражения.

std::regex e("<a\\s[^>]*href=\"([^\"]*?)\"[^>]*>(.*?)</a>");

std::smatch m;
std::string s = "abcd<a href=\"https://insights.ubuntu.com/feed/\">Canonical</a>abcd";

std::regex_search(s,m,e);
if( m.size() > 1 )
  std::cout << "Enlace encontrado: " << m[1] << '\n';
else
  std::cout << "Enlace NO encontrado";

Если не, ты всегда можешь использовать boost (код достаточно сходный)... или даже можешь делать поиски вручную.

Самое простое в этом случае состояло бы в том, чтобы обнаруживать кавычки начала и конца:

std::string s = "abcd<a href=\"https://insights.ubuntu.com/feed/\">Canonical</a>abcd";

int pos1, pos2;
pos1 = s.find('\"');
if( pos1 == std::string::npos )
  pos1++;
else
  pos2 = s.find('\"',pos1);

if( pos1 == std::string::npos || pos2 == std::string::npos )
  std::cout << "Url no encontrada\n";
else
  std::cout << s.substr(pos1,pos2-pos1);
1
ответ дан 24.11.2019, 11:35
  • 1
    Если я permití s, versió n má s расширь, чтобы покрывать какое-то возможное место: e("<a\\b[^>]*\\shref\\s*=\\s*\"([^\"]*)\"[^>]*>(.*?)</a\\s*>") – Mariano 18.01.2017, 12:02
  • 2
    @Mariano, если pensé делать expresió n регулировать má s приспособляемый..., но ясный, тогда tení в котором быть висящим на возможном месте má s, которого у url нет из-за qué быть заключенной между двойными кавычками... и как который expresió n регулярный она заканчивала тем, что была слишком сложной для примера. В конце концов ú nica caracterí stica, что quedó это была та игнорирования всех признаков, предыдущих и следующих за href..., что podí чтобы удалить спокойно, но я pasó :) – eferion 18.01.2017, 12:07
  • 3
    Entendí intenció n твоего ответа, и intenció n он состоял в том, чтобы оставаться внутри того же достижения. Sé в qué могут конвертировать , но я pareció уместный упоминать об этом места, так как это очень обычно, что существовали около = и перед завершением tag, это пробуя не осложнить так . – Mariano 18.01.2017, 12:28
  • 4
    @Mariano Jajajaja, хороший пример, который ты выбрал. Это совершенный пример, который показывает сложное, что следует нравиться всему миру с ответом. – eferion 18.01.2017, 12:36
  • 5
    @Mariano ты habí в понятный верно. Я tambié n я делаю рекомендации в каких-то ответах и это не обусловливает тот факт, что они унесли или нет обет с моей стороны. – eferion 18.01.2017, 12:42