我正在尝试为我的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
}
}
我知道我可以完全从它找到的位置提取字符串并检查是否有文件扩展名......但我正在寻找一种更优雅的方法来使用字符串方法。此外,我还要进一步检查是否可能找不到该着色器名称。同样,相同的纹理文件可能再次出现在下面。虽然解析着色器本身没有问题。
好的,我已经查看了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;
}
我必须比较找到的字符串是否与着色器名称相同,由于额外的扩展名,它将排除纹理文件名称。唯一的问题是,它有点慢。