0

我在 C++ 11 中写了这行正则表达式:

regex a("(\\w\\d)+(\\W)?(*)(\\W)?(\\w\\d)+");

我想找到像 A * B(A 或 B 可以是数字)这样的短语,空格是可选的

但在这条线上,它抛出了一个豁免!这行代码有什么问题?

4

2 回答 2

6

转义星号(不确定是否应该用单反斜杠或双反斜杠转义,但如果我错了,请纠正我!):

regex a("(\\w\\d)+(\\W)?(\\*)(\\W)?(\\w\\d)+");
                         ^^

星号是正则表达式中的一个字符,表示一个字符或一组字符出现 0 次或更多次。

单独使用(*)无效,并导致“异常”:)

尽管如此,为了使它工作,你需要这个正则表达式:

regex a("(\\w)+(\\W)?(\\*)(\\W)?(\\w)+");

这应该与您的字符串匹配A * B

\w(或\\w)在你的情况下匹配数字和字母,所以不要担心使用\\d,因为你写它的方式,它会匹配一个带有数字的字母数字字符(或下划线)。

最后,如果您只想匹配而不是捕获,这应该仍然有效:

regex a("\\w+\\W?\\*\\W?\\w+");

附录:

regex rx{ R"((\w)+\W?(\*)\W?(\w)+)" };
cout << regex_replace("A * B", rx, "($1$2$3)");
于 2013-05-28T19:42:01.503 回答
1

*是正则表达式中的保留字符,将匹配一个字符 0 次或多次。您需要使用转义*字符\\* 来匹配*符号

例如

regex a("(\\w\\d)+(\\W)?(\\*)(\\W)?(\\w\\d)+");
于 2013-05-28T19:42:02.663 回答