1

考虑这样的声明:

virtual Foo * const operator=(Bar& b);

或者

virtual Foo * const operator=   (Bar& b); // note the optional number of whitespace after the function name

我想捕捉这Foo * const部分。换句话说,我想匹配字符串开头、可选的虚拟|静态和左大括号之间的所有字符,除了最后一个单词和大括号前的可选空格量。

我想出了以下内容:

(?virtual|static)?\s*(?.*?)(?!\s*\()

但这不起作用。

编辑:更多示例:

输入捕捉
----- --------
无效 f(); 空白
静态 int Foo(); 整数
虚拟 const int * const const int * const
虚拟 Foo * operator+(Foo& b); 富 *
4

1 回答 1

1

我不太确定你在找什么,但如果我做对了,这可能就是你要找的:

^(?:virtual|static)?\s*(.*?)(?=\s\w+=)

并在这里测试。

不过,前瞻不是必需的:

^(?:virtual|static)?\s*(.*?)\s\w+=

否则,如果你想得到整个Foo * const operator= (部分,也许这个?

^(?:virtual|static)?\s*(.*?)\(

我觉得您不太了解负前瞻或非捕获组。

(?:...)是一个非捕获组(注意冒号)。

(?!...)是一个否定的前瞻,它可以防止匹配一个字符被组中的内容所跟随。您宁愿在您的案例中使用积极的前瞻来捕获该括号之前的所有内容,但在这种特殊情况下没有必要,因为一个简单的.*\(就足够了。

编辑:根据新的测试样本,更复杂的正则表达式:

^(?:virtual|static)?\s*(.+?)(?:(?:\s*\w+[\(=\+\?\!])|$)
于 2013-05-30T08:29:43.743 回答