如何在C 中的长字符串中找到精确的字符串匹配

How to find exact string match in a long string in C++

本文关键字:字符串 串匹配 字符      更新时间:2023-10-16

我正在尝试为我的3D引擎解析Quake3着色器脚本文件。我需要在一个长字符串中找到着色器名称,即所有脚本文件的累积。我使用字符串:: find()查找第一次发生(并且只有文件中没有重复的情况)。问题是有时它返回真实,而第一个着色器名称substring而不是确切的着色器名称的位置。

例如,我有这个着色器名称:

纹理/castle_wall/castle_c46_a

问题是它到达时返回真实:

纹理/castle_wall/castle_c46_a.tga

因为着色器名称包含在其中。

我需要忽略这种情况,因为它是其他名称的另一个着色器中使用的纹理文件名。我知道可能有一种方法可以轻松地使用另一种语言(使用Regex?)进行操作,但是我还没有使用搜索引擎在Stackoverflow上找到C 的案例。

基本上我使用的代码是:

if ((pos = m_scriptData->find(shaderName)) != m_scriptData->npos)
{
    // parse it
}

其中m_scriptData是长字符串。

一个示例着色器,带有着色器名称的阴暗器就是这样:

textures/skies/xtoxicsky_dm9
{
    qer_editorimage textures/skies/toxicsky.tga
    surfaceparm noimpact
    surfaceparm nolightmap
    q3map_globaltexture
    q3map_lightsubdivide 256
    q3map_surfacelight 400
    surfaceparm sky
    q3map_sun 1 1 0.5 150 30 60
    skyparms full 512 -
    {
        map textures/skies/inteldimclouds.tga
        tcMod scroll 0.1 0.1
        tcMod scale 3 2
    }
    {
        map textures/skies/intelredclouds.tga
        blendFunc add
        tcMod scroll 0.05 0.05
        tcMod scale 3 3
    }
}

我知道我可以从发现的位置中完全提取字符串并检查那里是否有文件扩展名...但是我正在寻找一种更优雅的方法来使用字符串方法来执行此操作。另外,我必须进一步检查下面的着色器名称是否在该名称下面找到。同样,同一纹理文件可能再次出现在下面。我没有问题来解析着色器本身。

好吧,我看过std :: Regex参考,并能够使其正常工作。

这是我使用的代码:

bool XShaderParser::FindShader(const std::string& shaderName)
{
    std::regex reg(shaderName);
    std::smatch m;
    while(std::regex_search(*m_scriptData, m, reg))
    {
        for (auto x : m)
        {
            if (x.length() == shaderName.length())
                return true;
        }
    }
    return false;
}

我必须比较是否发现的字符串与着色器名称相同,该名称不包括纹理文件名,因为额外的扩展名。唯一的问题,有点慢。