Wie kann ich in C++ herausfinden, ob eine Zeichenkette mit einer anderen Zeichenkette endet?
Antworten
Zu viele Anzeigen?En std::mismatch
Methode kann diesen Zweck erfüllen, wenn sie verwendet wird, um rückwärts vom Ende der beiden Strings zu iterieren:
const string sNoFruit = "ThisOneEndsOnNothingMuchFruitLike";
const string sOrange = "ThisOneEndsOnOrange";
const string sPattern = "Orange";
assert( mismatch( sPattern.rbegin(), sPattern.rend(), sNoFruit.rbegin() )
.first != sPattern.rend() );
assert( mismatch( sPattern.rbegin(), sPattern.rend(), sOrange.rbegin() )
.first == sPattern.rend() );
Meiner Meinung nach ist die einfachste Lösung C++:
bool endsWith(const std::string& s, const std::string& suffix)
{
return s.rfind(suffix) == std::abs(s.size()-suffix.size());
}
Warnung: Wenn der Treffer fehlschlägt, wird die gesamte Zeichenkette rückwärts durchsucht, bevor aufgegeben wird, wodurch möglicherweise viele Zyklen verschwendet werden.
Sea a
eine Zeichenkette sein und b
die Zeichenfolge, die Sie suchen. Verwenden Sie a.substr
um die letzten n Zeichen von a
und vergleichen sie mit b (wobei n die Länge von b
)
Oder verwenden Sie std::equal
(enthalten <algorithm>
)
Ex:
bool EndsWith(const string& a, const string& b) {
if (b.size() > a.size()) return false;
return std::equal(a.begin() + a.size() - b.size(), a.end(), b.begin());
}
Lassen Sie mich die Josephs Lösung mit der Version, die Groß- und Kleinschreibung nicht berücksichtigt ( Online-Demo )
#include <string>
#include <cctype>
static bool EndsWithCaseInsensitive(const std::string& value, const std::string& ending) {
if (ending.size() > value.size()) {
return false;
}
return std::equal(ending.crbegin(), ending.crend(), value.crbegin(),
[](const unsigned char a, const unsigned char b) {
return std::tolower(a) == std::tolower(b);
}
);
}