我是一位经验丰富的C ++开发人员,但对STL来说相对较新。我之前的任何项目都没有使用过STL。我正在尝试使用正则表达式来解析Windows服务文件(Windows\System32\drivers\etc\services
),并且我的表达式在Notepad ++中工作正常(在我删除为C字符串文字添加的加倍反斜杠后),但我的STL代码无法匹配相同的表达和文字。我调试了它,我能说的最好,我认为它匹配“e”到[A-Za-z],然后未能将“c”与[^] *匹配,可能是因为它没有看到范围被否定。我越过STL正则表达式代码中的_N_if
节点,然后_N_rep
节点失败(在调用堆栈中嵌套了几层)它正在处理_N_class
节点。 _Node=>_Flags
值为_Fl_final
(4),不包含_Fl_negate
(1)标记。
我认为,这是我正在尝试调试的基本代码:
std::basic_regex<TCHAR> re(_T("^([A-Za-z][^ ]*)\\s+(\\d{1,5})\\/(tcp|udp)\\b.*"), std::regex_constants::ECMAScript);
//...
std::match_results<const TCHAR*> mr;
if (std::regex_match(szLine, mr, re))
我相信szLine的内容是
echo 7/tcp
看起来“e”匹配,如果我的调试技巧很好,那么“c”就会失败。
我正在使用Visual Studio 2013。
编辑: szLine以换行符结尾。我想知道这是否会导致匹配失败,因为默认情况下.
与换行符不匹配?
答案 0 :(得分:0)
使用regex_match
时必须记住匹配必须应用于整个字符串,包括换行符(如果存在)。请记住默认情况下.
与换行符不匹配,这里的答案是将\\n?
添加到C字符串文字的末尾,该字符串解析为\n?
进入模式,匹配字符串末尾的可选换行符。
答案 1 :(得分:0)
为了匹配包含换行符的任何符号,您可以使用[\s\S]
(或[\d\D]
或甚至[\w\W]
)字符类。
此外,您的正则表达式与您提供的字符串不匹配,因为没有第二个\d+
。以下是适用于regex_match
的示例代码:
string line = "echo 7/tcp\n"; // <-- \n is added
string regexStr = "^([A-Za-z][^ ]*)\\s+(\\d{1,5})/(tcp|udp)\\b[\\s\\S]*";
// ^^^^^^^^^
regex rg(regexStr);
smatch sm;
if (regex_match(line, sm, rg)) {
std::cout << sm[1] << std::endl;
std::cout << sm[2] << std::endl;
std::cout << sm[3] << std::endl;
}
请参阅IDEONE demo
结果是:
echo
7
tcp