在 C 代码中提取字符串的正则表达式(不在注释内)

Posted

技术标签:

【中文标题】在 C 代码中提取字符串的正则表达式(不在注释内)【英文标题】:Regular expression to extract string in C Code (not inside comment) 【发布时间】:2014-06-15 15:29:51 【问题描述】:

我在 C 中有这段代码,但我只知道如何使用不在注释代码中的正则表达式提取字符串:

1. /*  * "path_build()" function in "home.c" for more information.  
2. * this is an example basic"
3. */
4.
5. /*** Free ***/ 
6. VALOR = string_make(format("%sxtra", libpath)); 
7. event_signal_string(EVENT_INITSTATUS, "Inicializando...");

应该只返回:

"%sxtra" 
"Inicializando..."

我试试:

".*"

但它不起作用,它显示“”内的所有文本,包括 /*...*/ 内的字符串

我使用 EditPag Pro,RegExp 面板。 这是一个游戏翻译项目,我把每个 C 文件的字符串翻译成西班牙语。我无法删除原始文件的 cmets。

我唯一清楚的是,这是在 C 中查找 cmets 的正则表达式,也许这将有助于解决方案:

(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)

有什么帮助吗?

编辑:我输入了行数。

【问题讨论】:

你确定你想让正则表达式做所有这些吗?相反,请考虑 1:删除 cmets。 2:使用正则表达式。 1.删除 cmets。 2.提取"blablabla" 还应注意".*" 不是获取字符串中所有文本的好方法,即使您删除了 cmets。如果你有类似"blah", variable_name, "more blah" 的东西,这将返回从第一个开始" 到第二个结束" 的所有内容 对于初学者来说,匹配 C 多行注释块的更好的正则表达式是:/\*[^*]*\*+(?:[^*/][^*]*\*+)*/(取自Mastering Regular Expressions (3rd Edition))(参见:Improving/Fixing a Regex for C style block comments 【参考方案1】:

Hernaldo,这是一个有趣的问题。

这里有两个版本,因为我不确定你是要捕获“inside of the string”还是"the whole string"

下面的正则表达式捕获字符串以捕获第 1 组。您完全忽略了整体匹配(第 0 组),而只关注第 1 组。要检索字符串,只需在您的语言中迭代第 1 组匹配项(如果任何)。

版本 1:“The inside of the string

(?s)/\*.*?\*/|"([^"]+)"

这会将%sxtraInicializando... 捕获到第1 组。

版本 2:"The whole string"

(?s)/\*.*?\*/|("[^"]+")

这会将"%sxtra""Inicializando..." 捕获到第1 组。

如果您有任何问题,请告诉我!

注意:我没有处理/* nested /* comments */ */,因为问题中没有指定。这将需要一些调整,并且可能需要一个支持递归的正则表达式引擎。

【讨论】:

您好 zx81,为了测试您的两个选项,我提供了以下几行:123、5、6 和 7,这正是我想要的。这个想法是单个正则表达式只给我第 6 行和第 7 行或第 6 行和第 7 行的字符串。想法是它失败了第 1、2、3 或 5 行中的任何一个。 @HernaldoGonzalez 没错,我给你的正则表达式只返回我告诉你的 Group 1 字符串(你想要的那些)。有些在线测试人员可能不喜欢这样,但你可以在RegexBuddy 中测试一下,有问题吗? @HernaldoGonzalez 我很困惑,你是说我的回答不适合你吗?如果是这样,你能解释一下问题吗?在我的测试中,它运行良好。 不,不适合我。我在具有 RegeExp 功能的 EditPad Pro 的搜索面板中测试了两个正则表达式,我知道它使用相同的 RegexBuddy 模式,它对我来说是所有代码的每一行字符串的标记,它包括注释内的字符串和外部注释(所以非常搜索速度很慢,并确定该行是否是要翻译的真实行),而不仅仅是我希望的代码字符串所在的行(cmets 内没有字符串)。我无法安装 RegexBuddy 来复制和粘贴我拥有的每个代码 C。游戏有60个或更多文件。我的想法是使用与 RegExp 功能相同的搜索面板。 @HernaldoGonzalez 它似乎在 EditPadPro 中不起作用的原因(顺便说一下,我也使用并喜欢它)是如上所述,我给你的解决方案将字符串捕获到第 1 组。您要查找的不是匹配项,而是捕获项,您可以在 EPP 替换字段中将其引用为 $1。但我认为您使用的是诸如 C 之类的编程语言,并且可以测试第 1 组捕获是否为空。【参考方案2】:

EditPad 6/7 的最终解决方案是:

(?<!^[ \t]*/?[*#][^"\n]*")(?<=^[^"\n]*")[^"]+

链接: Regular expression for a string that does not start with a /*

【讨论】:

以上是关于在 C 代码中提取字符串的正则表达式(不在注释内)的主要内容,如果未能解决你的问题,请参考以下文章

用java正则表达式提取java程序中的注释

C# 正则表达式提取指定文本内的内容

C# 正则表达式提取指定文本内的内容

C# 正则表达式提取指定文本内的内容

C# 正则表达式提取指定文本内的内容

R stringr 正则表达式提取括号内的字符