如何只在std::string的一部分中找到一个子串?
How to find a substring in only a portion of a std::string?
我有一个 std::string
,我希望只能在其中的一部分中找到文本:所以我需要指定开始和结束位置。
在std::string::find()
中只能指定起始位置
我正在尝试找到仅在 haystack
的一部分中进行搜索的最佳方法。这将包括给出一个 end_pos
来停止搜索,即使它没有到达 haystack
.
的末尾
例如,只搜索从第 100 个字符到第 200 个字符。
有人知道我如何(优雅地)做到这一点吗?
- 只能在
haystack
本身中搜索,而不是在 substr()
中搜索
- 不创建
haystack
的副本
- 在 C++98 中
std::string
没有适合您搜索 haystack
字符串子范围的要求的方法。请查看 std::search()
,例如:
std::string needle = ...;
std::string::iterator end_iter = haystack.begin() + end_pos;
std::string::iterator found_iter = std::search(haystack.begin() + start_pos, end_iter, needle.begin(), needle.end());
if (found_iter != end_iter) {
// needle found...
}
else {
// needle not found...
}
如果您的编译器没有 std::search()
可用,那么只需编写您自己的 search()
函数,例如 cppreference.com 上提供的实现,例如:
namespace my {
template<class ForwardIt1, class ForwardIt2>
ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last)
{
while (1) {
ForwardIt1 it = first;
for (ForwardIt2 s_it = s_first; ; ++it, ++s_it) {
if (s_it == s_last) return first;
if (it == last) return last;
if (!(*it == *s_it)) break;
}
++first;
}
}
}
...
std::string needle = ...;
std::string::iterator end_iter = haystack.begin() + end_pos;
std::string::iterator found_iter = my::search(haystack.begin() + start_pos, end_iter, needle.begin(), needle.end());
if (found_iter != end_iter) {
// needle found...
}
else {
// needle not found...
}
我有一个 std::string
,我希望只能在其中的一部分中找到文本:所以我需要指定开始和结束位置。
在std::string::find()
中只能指定起始位置
我正在尝试找到仅在 haystack
的一部分中进行搜索的最佳方法。这将包括给出一个 end_pos
来停止搜索,即使它没有到达 haystack
.
例如,只搜索从第 100 个字符到第 200 个字符。
有人知道我如何(优雅地)做到这一点吗?
- 只能在
haystack
本身中搜索,而不是在substr()
中搜索 - 不创建
haystack
的副本
- 在 C++98 中
std::string
没有适合您搜索 haystack
字符串子范围的要求的方法。请查看 std::search()
,例如:
std::string needle = ...;
std::string::iterator end_iter = haystack.begin() + end_pos;
std::string::iterator found_iter = std::search(haystack.begin() + start_pos, end_iter, needle.begin(), needle.end());
if (found_iter != end_iter) {
// needle found...
}
else {
// needle not found...
}
如果您的编译器没有 std::search()
可用,那么只需编写您自己的 search()
函数,例如 cppreference.com 上提供的实现,例如:
namespace my {
template<class ForwardIt1, class ForwardIt2>
ForwardIt1 search(ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last)
{
while (1) {
ForwardIt1 it = first;
for (ForwardIt2 s_it = s_first; ; ++it, ++s_it) {
if (s_it == s_last) return first;
if (it == last) return last;
if (!(*it == *s_it)) break;
}
++first;
}
}
}
...
std::string needle = ...;
std::string::iterator end_iter = haystack.begin() + end_pos;
std::string::iterator found_iter = my::search(haystack.begin() + start_pos, end_iter, needle.begin(), needle.end());
if (found_iter != end_iter) {
// needle found...
}
else {
// needle not found...
}