首页 > 解决方案 > 正则表达式:将 \r\n 作为普通单词处理

问题描述

我正在做一个小项目,可以计算 C++ 文件(.cpp)中函数的数量。

我使用以下正则表达式作为“函数模式”:

/[a-z|A-Z]+\s*::\s*~?[a-z|A-Z]+\(.*\)/gm

它适用于大多数情况,但在 () 中有新的换行符时会失败。

void CXYZRScanPanel::OnPrepareScanning()
{
    //This one is ok.
}

void CXYZRScanPanel::OnPrepareScanning(int k)
{
    //This one is ok.
}

void CXYZRScanPanel::OnPrepareScanning(int k, 
                                       int j)
{
    //This one fails.
}

我在想是否有任何比 .* 更“强大”的东西可以跳过 \r\n。谢谢你的帮助。

如果没有这样的事情,我可能会在执行此操作之前删除 () 中的所有 /r/n。

标签: regex

解决方案


您可以使用否定字符类来编写模式,该类从[^匹配除任何字符之外的任何字符开始,(并且)也将匹配换行符。

请注意,您可以|在字符类中省略 。

[a-zA-Z]+\s*::\s*~?[a-zA-Z]+(\([^()]*\))

模式匹配:

  • [a-zA-Z]+匹配 1+ 次字符 a-zA-Z
  • \s*::\s*::可选空白字符之间的匹配
  • ~?匹配一个可选~字符
  • [a-zA-Z]+匹配 1+ 次字符 a-zA-Z
  • (捕获组 1
    • \([^()]*\)可选地匹配任何字符,除了括号(之间)
  • )关闭组 1

查看正则表达式演示


推荐阅读