我正在尝试获取大文档的名称和密码(这是一种练习,没什么不好的问题:p)。
我使用正则表达式表示名称,如下所示
regex e ("\\ b (name) ([^] *)");
这个问题来的钥匙,因为他们来到右后(如果我做regex p ("\\ b (() ([^] *)")
,它给了我在它初始化时,它可能不会被初始化以及内存错误,但我做的对于诸如(
例如DOC:
名图灵 通过(31)<-我不能接受这31
致谢!
答案 0 :(得分:3)
正如其他人在评论中指出的那样,如果要与方括号匹配,则需要使用方括号。但是请注意,然后有两种转义机制:regex引擎的转义机制和C ++字符串文字的转义机制。
因此,例如,正则表达式引擎可能期望如下所示:
\(name\) \(\d+\)
此处括号()
被转义,因此正则表达式引擎不会将其用于分组。因此,上述正则表达式例如与(name) (123)
相匹配。
现在要编写C ++字符串文字,您需要转义(特别是)反斜杠。这样你会写
std::regex e("\\(name\\) \\(\\d+\\)");
如果您想避免这些讨厌的\\
,则还可以使用原始字符串文字:
std::regex e(R"X(\(name\) \(\d+\))X");
~~~~~~~~~~~~~~~~
在这里,前缀“ R”表示您编写的是原始字符串文字。 X(
和)X
是任意的定界符。 (有关https://en.cppreference.com/w/cpp/language/string_literal或各种SO问题的更多信息。)
顺便注意一下正则表达式中的空格。您编写了[^] *
,它匹配一个任意字符,后跟任意数量的空格。这可能不是你的意思。