什么正则表达式仅在 C++ 源文件中查找字符串
Posted
技术标签:
【中文标题】什么正则表达式仅在 C++ 源文件中查找字符串【英文标题】:What regular expression to find strings only in C++ source files 【发布时间】:2014-04-29 14:02:23 【问题描述】:我有一个 C++ 应用程序,我正在转换每个字符串文字以及使用泛型类型启用 unicode 的方法,换句话说,正在完成以下转换
const char* str = "this is \"simple string\""; //=> const TCHAR* str = _T("this is \"simple string\"");
MessageBoxA(NULL, "message", "title", MB_OK);//=>MessageBox(NULL, _T("message"), _T("title"), MB_OK);
size_t len = strlen(str);//=>size_t len = _tcslen(str);
最大的问题是应用程序包含大量文字字符串,我需要一个正则表达式模式来仅查找文字字符串并将它们替换为 _T(previous_str),我从 web 中找到了许多表达式,并且从 *** 中找到了许多表达式,但是它们还匹配标题包括
#include "stdafx.h" // => #include _T("stdafx.h")
我还需要避免以 _T( 开头并以 ) 结尾的字符串 [之前已经转换]。
【问题讨论】:
您正在尝试解析源代码。这真是一项艰巨的任务。这就是为什么如果您选择正则表达式路径(硬件),您将需要一个强大的正则表达式引擎,如 PCRE 或 .NET。那么您使用的是什么引擎,您尝试过什么? 我用的是visual studio 2013 IDE,它挂了很长时间 您仍然可以分两遍执行此操作:将所有"string"
转换为_T("string")
,然后将所有#include _T("stdafx.h")
转换为#include "stdafx.h"
(_T(_T("string"))
相同 -> _T("string")
) .
这可能很好但很长,但是正则表达式的力量在哪里
@ahmedsafan86:当然是在解析 Regular 语法时。这就是名字的由来。但 C++ 绝不是常规的。
【参考方案1】:
艾哈迈德这是一个有趣的问题。让我们谈谈我们如何使用正则表达式来做到这一点。有很多选择,这就是我要做的。
A.我将在 VisualStudio 之外处理文件,以便您可以使用正则表达式的全部功能。您可以使用 C++、C# 或 php 或 python 等脚本语言,并为其提供要处理的文件数组或文件夹。
B.这是一个正则表达式,可以将您想要的字符串捕获到第 1 组中:
(?s)_T\([^)]*\)|#include[^\n]*|"((?:[^"]|(?<=\\)")+)(?<!\\)"
使用这个正则表达式,我们希望完全忽略返回的整体匹配,而只关注第 1 组捕获(如果有)。
在您的测试文本中,捕获是 this is \"simple string\"
和正确的 message
和 title
。
这捕获了字符串的内部,但我们可能需要它们来替换,所以要包含双引号,只需将它们移动到组 1 中:
(?s)_T\([^)]*\)|#include[^\n]*|("(?:[^"]|(?<=\\)")+(?<!\\)")
C.当调用你的语言的正则表达式 Replace 函数时,不是直接传递一个替换,而是传递一个回调函数。该函数将自动访问第 1 组匹配项(这就是替换回调的工作方式),您可以根据自己的意愿操作替换:例如,如果第 1 组为空,则不要替换(这意味着我们匹配了你想避免的字符串)。如果您有第 1 组,请发挥您的串联魔法。
很难更具体,但这是我使用正则表达式的一般方法。
【讨论】:
真的太棒了,我在我最喜欢的 .NET 正则表达式在线测试器 derekslager.com/blog/posts/2007/09/… 中对其进行了测试,您的模式对我有很大帮助,我添加了一个部分以记住 L"",后缀 (?s)L"(?:[^"]|(? @ahmedsafan86 很高兴,很高兴它有所帮助,感谢您的友好反馈。 :)以上是关于什么正则表达式仅在 C++ 源文件中查找字符串的主要内容,如果未能解决你的问题,请参考以下文章