diff --git a/folly/String.h b/folly/String.h index 24a4e7b81a7..79e6d64cda0 100644 --- a/folly/String.h +++ b/folly/String.h @@ -771,7 +771,7 @@ struct format_string_for_each_named_arg_fn { auto const pos = str.find('{'); auto const beg = pos == view::npos ? str.size() : pos + 1; if (beg == str.size()) { - return; // malformed + return; // completed } if (str[beg] == '{') { str = str.substr(beg + 1); @@ -782,10 +782,11 @@ struct format_string_for_each_named_arg_fn { return; // malformed } auto const arg = str.substr(beg, end - beg); - if (!arg.empty() && (arg[0] == '_' || std::isalpha(arg[0]))) { + auto const c = arg.empty() ? 0 : arg[0]; + if (c == '_' || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) { fn(arg); } - str = str.substr(beg); + str = str.substr(end); } } }; diff --git a/folly/test/StringTest.cpp b/folly/test/StringTest.cpp index 79d65de1104..8e0478481ff 100644 --- a/folly/test/StringTest.cpp +++ b/folly/test/StringTest.cpp @@ -1487,4 +1487,5 @@ TEST(String, format_string_for_each_named_arg) { EXPECT_THAT(fn("hello{3}world{bob}go"), testing::ElementsAre("bob")); EXPECT_THAT(fn("hello{bob}world{3}go"), testing::ElementsAre("bob")); EXPECT_THAT(fn("hello{bob}world{sam}go"), testing::ElementsAre("bob", "sam")); + EXPECT_THAT(fn("{bob}world{sam}"), testing::ElementsAre("bob", "sam")); }