如何在C 中的长字符串中找到精确的字符串匹配
How to find exact string match in a long string in C++
我正在尝试为我的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;
}
我必须比较是否发现的字符串与着色器名称相同,该名称不包括纹理文件名,因为额外的扩展名。唯一的问题,有点慢。
相关文章:
- 找到具有最多子串栅栏的字符串排列
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 我的求解(字符串 a、字符串 b)的输出与随机哈希中的预期输出不匹配
- 没有使用两种类型的字符串进行匹配的函数调用
- 如何修复"找不到系统(字符串)的匹配项
- 错误:调用"std::basic_ifstream<char>::basic_ifstream(std::__cxx11::字符串&)"没有匹配函数
- 错误:调用"人脸检测器::人脸检测器(std::__cxx11::字符串)"没有匹配函数
- 正在检查字符串以匹配Char变量
- Q_DECLARE_INTERFACE()和Q_PLUGIN_METADATA(),接口id字符串需要匹配
- C++11 正则表达式与字符串不匹配
- 返回的字符串和提取的字符串不匹配
- 使用后缀数组和 LCP(-LR) 实现字符串模式匹配
- 生成与集合中的字符串不匹配的字符串
- _stricmp返回错误的值,而字符串确实匹配.该怎么办
- C++中两个字符串之间匹配的字符数
- 如何使用标准库(包括boost)实现简单的字符串模式匹配
- 定位字符串中匹配的单词
- C++ regex_match match_continuous标志与开始子字符串不匹配
- 字符串模式匹配和插入
- 字符串文字匹配bool重载,而不是std::String