AK: Add trim() method to String, StringView and StringUtils

The methods added make it possible to use the trim mechanism with
specified characters, unlike trim_whitespace(), which uses predefined
characters.
This commit is contained in:
Max Wipfli 2021-05-25 09:42:01 +02:00 committed by Andreas Kling
parent 14506e8f5e
commit 0e4f7aa8e8
4 changed files with 17 additions and 5 deletions

View file

@ -119,9 +119,14 @@ public:
[[nodiscard]] bool is_whitespace() const { return StringUtils::is_whitespace(*this); }
#ifndef KERNEL
[[nodiscard]] String trim(const StringView& characters, TrimMode mode = TrimMode::Both) const
{
return StringUtils::trim(view(), characters, mode);
}
[[nodiscard]] String trim_whitespace(TrimMode mode = TrimMode::Both) const
{
return StringUtils::trim_whitespace(StringView { characters(), length() }, mode);
return StringUtils::trim_whitespace(view(), mode);
}
#endif

View file

@ -292,7 +292,7 @@ bool is_whitespace(const StringView& str)
return true;
}
StringView trim_whitespace(const StringView& str, TrimMode mode)
StringView trim(const StringView& str, const StringView& characters, TrimMode mode)
{
size_t substring_start = 0;
size_t substring_length = str.length();
@ -301,7 +301,7 @@ StringView trim_whitespace(const StringView& str, TrimMode mode)
for (size_t i = 0; i < str.length(); ++i) {
if (substring_length == 0)
return "";
if (!isspace(str[i]))
if (!characters.contains(str[i]))
break;
++substring_start;
--substring_length;
@ -312,7 +312,7 @@ StringView trim_whitespace(const StringView& str, TrimMode mode)
for (size_t i = str.length() - 1; i > 0; --i) {
if (substring_length == 0)
return "";
if (!isspace(str[i]))
if (!characters.contains(str[i]))
break;
--substring_length;
}
@ -321,6 +321,11 @@ StringView trim_whitespace(const StringView& str, TrimMode mode)
return str.substring_view(substring_start, substring_length);
}
StringView trim_whitespace(const StringView& str, TrimMode mode)
{
return trim(str, " \n\t\v\f\r", mode);
}
Optional<size_t> find(const StringView& haystack, const StringView& needle)
{
return AK::memmem_optional(

View file

@ -50,7 +50,8 @@ bool ends_with(const StringView& a, const StringView& b, CaseSensitivity);
bool starts_with(const StringView&, const StringView&, CaseSensitivity);
bool contains(const StringView&, const StringView&, CaseSensitivity);
bool is_whitespace(const StringView&);
StringView trim_whitespace(const StringView&, TrimMode mode);
StringView trim(const StringView& string, const StringView& characters, TrimMode mode);
StringView trim_whitespace(const StringView& string, TrimMode mode);
Optional<size_t> find(const StringView& haystack, const StringView& needle);
String to_snakecase(const StringView&);

View file

@ -79,6 +79,7 @@ public:
[[nodiscard]] bool contains(const StringView&, CaseSensitivity = CaseSensitivity::CaseSensitive) const;
[[nodiscard]] bool equals_ignoring_case(const StringView& other) const;
[[nodiscard]] StringView trim(const StringView& characters, TrimMode mode = TrimMode::Both) const { return StringUtils::trim(*this, characters, mode); }
[[nodiscard]] StringView trim_whitespace(TrimMode mode = TrimMode::Both) const { return StringUtils::trim_whitespace(*this, mode); }
Optional<size_t> find_first_of(char) const;