我想匹配一个函数定义。函数定义可以像
int foo () {
// Some statement
}
int foo(int a, int b){}
int foo ()
{
}
我编写了一个正则表达式
foo\s*\([\w, ]*\)\s*{
并在atom文本编辑器中尝试了它,它运行良好。但是当我尝试在 C++14 编译器中运行它时,它给了我 regex_error()。我的 C++ 正则表达式是 regex b("foo\s*\([\w, ]*\)\s*{");
。我也尝试过将括号双重转义为 \\(
但仍然不起作用。
您的正则表达式包含一个未转义的
{
字符,这在您在 regex101.com 测试的 PCRE 正则表达式中很好,但 std::regex
默认正则表达式引擎不允许未转义的 {
字符应与文字 {
字符匹配。
此外,最佳实践是使用原始字符串文字来定义正则表达式模式,因为正则表达式转义序列中的反斜杠不需要转义。
因此,您可以将当前的正则表达式修复为
regex b(R"(foo\s*\([\w, ]*\)\s*\{)");
或者,您可以修改模式以匹配一行中从
foo(
到最后一个 ){
的所有内容,方法是将 [\w, ]*
替换为贪婪点模式 .*
:
regex b(R"(foo\s*\(.*\)\s*\{)");
查看 C++ 演示:
regex r(R"(foo\s*\([\w, ]*\)\s*\{)");
string s("int foo () {\n // Some statement\n}\nint foo(int a, int b){}\nint foo ()\n{\n}");
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << m.str() << '\n';
}
输出:
foo () {
foo(int a, int b){
foo ()
{
这是我在 Python 中使用的一些正则表达式来匹配 C++ 函数声明
method_pattern = re.compile(
r'(public|private|protected|internal)?\s*(\w+)\s*\w+\s*\([^\)]*\)\s*(;|;?$)'
)
随意尝试重新使用这个正则表达式。
为了测试是否匹配,这是我使用的示例程序:
test_cases = [
"static void poop()", "bool myFunction()", "int myFunc(int poop)",
"public void hello()", "public static void hello()", "hello", "goodbye()",
"double cat(int myCat);"
]
for test_case in test_cases:
if method_pattern.search(test_case):
print(f"Match: {test_case}")
else:
print(f"No match: {test_case}")