stelle ich mir eine unbekannte Zeichenfolge, die das folgende Format folgt:Wie extrahiere ich eine Zeichenfolge zwischen geschweiften Klammern auf der gleichen Ebene?
Blablabla
{
"Some Text"
2
{
"Sub Text"
99
}
2
{
"Sub Text"
99
}
}
Blablabla2
{
"Some Text"
2
{
"Sub Text"
99
}
}
ich von dieser Zeichenfolge müssen in der Lage zu extrahieren zwischen der ersten Schicht von Trennzeichen jeder Teilkette ({
und }
). Also, in diesem Beispiel läuft die unten Funktion:
ExtractStringBetweenDelimitersOnSameLevel(string, "{", "}")
Sollte folgende Zeichenkette aus der ursprünglichen Zeichenfolge extrahieren und sie dann zurück:
"Some Text"
2
{
"Sub Text"
99
}
Das Problem ist, dass es eine kürzere Zeichenfolge zurückgibt aufgrund der zweiten Schicht von Begrenzern.
Hier ist mein Code:
const int Count(
const std::string& haystack,
const std::string& needle,
const int starting_index,
const int maximum_index)
{
int total = 0;
int offset = starting_index;
size_t current_index = std::string::npos;
while ((current_index = haystack.find(needle, offset)) != std::string::npos)
{
if (current_index >= maximum_index)
{
break;
}
total++;
offset = static_cast<int>(current_index + needle.size());
}
return total;
}
const size_t FindNthDelimiter(
const std::string& haystack,
const std::string& needle,
const int nth)
{
int total_found = 0;
int offset = 0;
size_t current_index = std::string::npos;
while ((current_index = haystack.find(needle, offset)) != std::string::npos)
{
total_found++;
offset = static_cast<int>(current_index) + 1;
if (total_found == nth)
{
return offset;
}
}
std::cout << "String does not have nth element." << std::endl;
return offset;
}
std::string ExtractStringBetweenDelimitersOnSameLevel(
std::string& original_string,
const std::string& opening_delimiter,
const std::string& closing_delimiter)
{
// Find the first delimiter...
const size_t first_delimiter = original_string.find(opening_delimiter);
if (first_delimiter != std::string::npos)
{
const size_t second_delimiter = original_string.find(closing_delimiter);
if (second_delimiter != std::string::npos)
{
// Total first delimiters found until first closed delimiter...
int total_first_delimiters = Count(original_string, opening_delimiter, static_cast<int>(first_delimiter), static_cast<int>(second_delimiter));
const size_t index_of_nth_closer = FindNthDelimiter(original_string, closing_delimiter, total_first_delimiters);
std::string needle = original_string.substr(first_delimiter + opening_delimiter.size(), index_of_nth_closer - opening_delimiter.size() - 1);
original_string.erase(first_delimiter, index_of_nth_closer + closing_delimiter.size());
return needle;
}
}
return "";
}
Iterieren durch Zeichenfolge, inkrementieren einen Zähler, wenn Sie ein {drücken, dekrementieren Sie einen Zähler, wenn Sie ein} drücken, wenn Ihr Zähler auf 0 zurückgeht, kopieren Sie die Teilzeichenfolge. –
Danke @JonathanPotter Mir fiel es schwer, über einen Weg nachzudenken, das zu tun .. Nicht sicher warum, scheint jetzt einfach, aber haha. – Ricky