gpt4 book ai didi

c++ - 为什么我得到多个正则表达式匹配项?

转载 作者:行者123 更新时间:2023-11-28 03:15:13 26 4
gpt4 key购买 nike

我正在尝试为 GLSL 着色器代码编写一个处理器,它将允许我分析代码并动态确定我需要为每个着色器处理哪些输入和输出。

为此,我决定在通过 OpenGL 编译之前使用一些正则表达式来解析着色器代码。

我已经编写了一些测试代码来验证正则表达式是否按预期工作。

代码:

#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main()
{

string strInput = " in vec3 i_vPosition; ";
smatch match;
// Will appear in regex as:
// \bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(\[[0-9]+\])?\s*;
regex rgx("\\bin\\s+[a-zA-Z0-9]+\\s+[a-zA-Z0-9_]+\\s*(\\[[0-9]+\\])?\\s*;");

bool bMatchFound = regex_search(strInput, match, rgx);

cout << "Match found: " << bMatchFound << endl;

for (int i = 0; i < match.size(); ++i)
{
cout << "match " << i << " (" << match[i] << ") ";
cout << "at position " << match.position(i) << std::endl;
}

}

唯一的问题是上面的代码生成了两个结果而不是一个。虽然其中一个结果是空的。

输出:

Match found: 1
match 0 (in vec3 i_vPosition;) at position 6
match 1 () at position 34

当我提供整个文件作为输入时,我最终希望生成多个结果,但我希望获得一些一致性,以便我可以以一致的方式处理结果。

关于为什么我只期待一个结果却得到多个结果,有什么想法吗?

最佳答案

您的正则表达式似乎包含反向引用

(\[[0-9]+\])?

其中将包含围绕 1 个或多个数字的方括号,但是 ?使其成为可选的。应用正则表达式时,前导空格和尾随空格会被

\s+ ... \s*

字符串的剩余部分匹配

[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*

并且反向引用位匹配空字符串。

如果您想匹配可选地包含该位的字符串,但不将其作为反向引用返回,请使用 ?: 将其设为被动:like:

\bin\s+[a-zA-Z0-9]+\s+[a-zA-Z0-9_]+\s*(?:\[[0-9]+\])?\s*

关于c++ - 为什么我得到多个正则表达式匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com