它可以使用(如在C ++中的正则表达式?

时间:2019-02-02 13:13:51

标签: c++ regex

我正在尝试获取大文档的名称和密码(这是一种练习,没什么不好的问题:p)。

我使用正则表达式表示名称,如下所示

regex e ("\\ b (name) ([^] *)");

这个问题来的钥匙,因为他们来到右后(如果我做regex p ("\\ b (() ([^] *)"),它给了我在它初始化时,它可能不会被初始化以及内存错误,但我做的对于诸如(

例如DOC:

名图灵 通过(31)<-我不能接受这31

致谢!

1 个答案:

答案 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问题的更多信息。)


顺便注意一下正则表达式中的空格。您编写了[^] *,它匹配一个任意字符,后跟任意数量的空格。这可能不是你的意思。

相关问题