diff --git a/AK/String.h b/AK/String.h index c6e6e468b4..0e11bcd7bb 100644 --- a/AK/String.h +++ b/AK/String.h @@ -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 diff --git a/AK/StringUtils.cpp b/AK/StringUtils.cpp index 37e5f6f9c7..18743b1521 100644 --- a/AK/StringUtils.cpp +++ b/AK/StringUtils.cpp @@ -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 find(const StringView& haystack, const StringView& needle) { return AK::memmem_optional( diff --git a/AK/StringUtils.h b/AK/StringUtils.h index ae4f490e54..a7f7ac2881 100644 --- a/AK/StringUtils.h +++ b/AK/StringUtils.h @@ -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 find(const StringView& haystack, const StringView& needle); String to_snakecase(const StringView&); diff --git a/AK/StringView.h b/AK/StringView.h index dab15292fb..d7738f08ed 100644 --- a/AK/StringView.h +++ b/AK/StringView.h @@ -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 find_first_of(char) const;