使用正则表达式匹配函数定义

问题描述 投票:0回答:2

我想匹配一个函数定义。函数定义可以像

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*{");
。我也尝试过将括号双重转义为
\\(
但仍然不起作用。

c++ regex c++11 c++14
2个回答
0
投票

您的正则表达式包含一个未转义的

{
字符,这在您在 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 ()
{

0
投票

这是我在 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}")

© www.soinside.com 2019 - 2024. All rights reserved.