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

时间:2017-12-26 19:05:31

标签: c++ string

我正在尝试为我的3D引擎解析Quake3着色器脚本文件。我需要在长字符串中找到着色器名称,这是所有脚本文件的累积。我使用string :: find()来查找第一次出现(如果文件中没有重复,则只使用一次)。问题是有时它返回true,第一个着色器名称substring的位置而不是确切的着色器名称。

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

纹理/ castle_wall / castle_c46_a

问题是它到达时返回true:

纹理/ castle_wall / castle_c46_a.tga

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

我需要忽略这种情况,因为它是在另一个名称的另一个着色器中使用的纹理文件名。我知道可能有一种方法可以用另一种语言轻松地做到这一点(使用正则表达式?),但我没有在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
    }
}

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

1 个答案:

答案 0 :(得分:0)

好的,我已经查看了std :: regex参考,并且能够使它工作。

这是我使用的代码:

:set +s

我必须比较找到的字符串是否与着色器名称相同,由于额外的扩展名,它会排除纹理文件名。唯一的问题是,它有点慢。