- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为什么这个正则表达式返回空字符串与 std::regex_match 的额外匹配?
std::regex trim_comments_spaces("^\\s*(?:(?:(.*?)\\s*[/]{2,}.*)|(?:(.*?)\\s*))$");
它似乎给出了正确的匹配,但我必须访问 std::smatch 结果的第三个元素。,这让我怀疑我的更改/分组/捕获语法有点错误。
std::string trim_line(std::string current_line) {
std::string trimmed_line = "";
if (current_line != "#include <glsl.h>") {
std::regex trim_comments_spaces("^\\s*(?:(?:(.*?)\\s*[/]{2,}.*)|(?:(.*?)\\s*))$");
std::smatch sub_matches;
if (std::regex_match(current_line, sub_matches, trim_comments_spaces)) {
std::cout << sub_matches.size() << "\n";
std::string sub_string = sub_matches[2].str();
if (sub_string != "") {
std::regex validate_line("^(?:(?:[a-z][a-zA-Z0-9\\s_+*\\-/=><&|^?:{().,[\\]]*[;{})])|[}])$");
if (std::regex_match(sub_string.begin(), sub_string.end(), validate_line)) {
trimmed_line = sub_string;
}
else {
std::cout << "Syntax error(2): " << sub_string << "\n";
}
}
}
else {
std::cout << "Syntax error(1): " << current_line << "\n";
}
}
return trimmed_line;
}
最佳答案
您的正则表达式一旦针对匹配的字符串执行,将为您获取一个具有 3 组的 smatch 对象:
(.*?)
在 ^\\s*(?:(?:(.*?)\\s*[/]{2, }.*)|
(?:(.*?)\\s*))$
(.*?)
无论组是否匹配,如果你在模式中定义了一个(...)
,它将首先用一个空字符串初始化,然后,它要么被捕获的填充值,否则它将保持为空。当然,除非您使用同名组或分支重置,但您无法在 std::regex
中访问它们。您可以使用 Boost 并使用 "^\\s*(?|(?:(.*?)\\s*[/]{2,}.*)|(? :(.*?)\\s*))$"
(请参阅 (?|
构造,然后您需要的所有值都将在第 1 组中)
如果您使用当前代码,您可以连接第 1 组和第 2 组,因为其中一个组始终为空。
std::string sub_string = sub_matches[1].str() + sub_matches[2].str();
参见 C++ demo
关于c++ - vc++ std::regex_match 返回一个带有交替正则表达式的额外空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38657902/
这个问题在这里已经有了答案: Is gcc 4.8 or earlier buggy about regular expressions? (3 个答案) 关闭 6 年前。 我正在尝试对其中包含方括
#include`` #include `` #include `` using namespace std; int main () { try{ std::regex re("(http|ht
我在 site 上测试了正则表达式 [BCGRYWbcgryw]{4}\[\d\]似乎可以在以下 BBCC[0].GGRY[0].WWWW[soln] 中找到匹配项。它与 BBCC[0] 和 GGRY
我正在尝试编写递归下降解析器,并尝试在用户输入的字符串中搜索正则表达式的匹配项。我正在尝试执行以下操作以尝试理解 C++11 提供的库,但我得到了意想不到的结果。 std::string expre
我正在尝试检查 yyyy-mm-dd 格式的日期字符串的格式。我像这样调用 regex_match 函数: if (regex_match(date, regex("/\d{4}-\d{2}-\d{2
我正在尝试使用 std::regex_match()作为 std::count_if() 中的谓词与 std::vector类成员函数中的元素。但是不知道如何正确地将第二个参数(正则表达式值)绕过到函
这是我的代码: #include #include #include using namespace std; int main () { string test = "COPY" ;
我正在使用 C++ 正则表达式。无法掌握以下编程输出。 #include #include #include #include using namespace std; int main(){
我在 XCode 上使用 C++。我想使用 regex_match 匹配非字母字符,但似乎有困难: #include #include using namespace std; int main(
这个问题在这里已经有了答案: Is gcc 4.8 or earlier buggy about regular expressions? (3 个答案) 关闭 5 年前。 我有这段代码片段,是我从
这是我的部分代码 bool CSettings::bParseLine ( const char* input ) { //_asm INT 3 std::string line (
我试图弄清楚我在这个验证规则上做错了什么,因为它说了这个错误。 验证规则: $this->form_validation->set_rules('username', 'Username', 'tri
在我的代码中,我想根据封闭的 <> 括号处理 stirngs。为此,我想遍历字符串并一个一个地替换括号并根据括号内的内容做一些事情。 string msg = "This is an Example<
目标是:这个 json: {"secretWord1":"private", "something": "\"secretWord2\":\"privateToo\""} 通过 regex_match
这是我的程序: #include "stdafx.h" #include #include #include #include using namespace std; int _tmain(
我必须编写一个 C++ 正则表达式,但我无法在 regex_match 上获得正确的结果,因为我是 C++ 的新手。测试字符串为:D10A7;让我们说 unsigned_char[] stringTo
我有一些我认为应该触发的 boost Regex 代码。我是 boost 的新手,但我对 Regex 有一点了解。这是我正在使用的代码。 re = boost::basic_regex(_T("-+\
我想匹配输入字段中给定的字符串。 A sample data could be "hello" -> returns true or "\"" -> returns true or "this is
我知道: 惰性量词匹配:尽可能少(最短匹配) 还知道构造函数: basic_regex( ..., flag_type f = std::regex_constants::EC
这个问题在这里已经有了答案: Simple std::regex_search() code won't compile with Apple clang++ -std=c++14 (3 个答案)
我是一名优秀的程序员,十分优秀!