C ++,搜索和返回值

时间:2010-05-19 15:01:48

标签: c++

例如,假设我有这个字符串:

"Name, Name2, <b>Name3</b>, Name4, <b>Name5</b>"

我想在<b>标签内获取任何值/名称。因此,当我搜索char时,我在数组中得到以下内容:

Name3
Name5

有什么想法吗?感谢

4 个答案:

答案 0 :(得分:4)

对于这种类型的字符串搜索/匹配方法,只需使用boost regex

答案 1 :(得分:1)

这是一个仅使用STL的基本版本,它假定标签没有嵌套或行为不当

#include <iostream>
#include <string>
#include <vector>

int main()
{
    const std::string TAG_OPEN( "<b>" );
    const std::string TAG_CLOSE( "</b>" );
    const std::string s( "Name, Name2, <b>Name3</b>, Name4, <b>Name5</b>" );

    typedef std::vector< std::string > StringArray;
    StringArray tagContents;

    std::string::size_type index = 0;
    while( index != std::string::npos )
    {
        const std::string::size_type o = s.find( TAG_OPEN, index );
        if ( o == std::string::npos )
        {
            break;
        }

        const std::string::size_type c = s.find( TAG_CLOSE, index );
        if ( c == std::string::npos )
        {
            // mismatched tag, ignore?
            break;
        }

        const std::string::size_type tagContentsStart  = o + TAG_OPEN.size();
        const std::string::size_type tagContentsFinish = c;
        tagContents.push_back(
            s.substr( tagContentsStart
                    , tagContentsFinish - tagContentsStart ) );

        index = c + TAG_CLOSE.size();
    }


    for ( StringArray::const_iterator S  = tagContents.begin();
                                      S != tagContents.end();
                                    ++S )
    {
        std::cout << *S << std::endl;
    }

    return 0;
}

答案 2 :(得分:0)

start = strstr(s, "<b>")+3;
stop = strstr(start, "</b>");
strncpy(result, start, stop-start);

不要忘记添加错误检查。

后续比赛,对于懒人:

s = stop+3;

再次执行上述代码。

[编辑]停止/错误检查:检查strstr的返回码。

答案 3 :(得分:0)

如果您拒绝使用std::string并坚持使用C风格的字符串,您可以始终冒险并使用strtok。它具有修改文本字符串的功能。

请在使用前了解strtok的副作用。

我仍然强烈建议您使用字符std::string,然后使用std::string进行解析。 std::string的功能比使用C风格的字符串要多得多。