在 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)/\*.*?\*/|"([^"]+)"
这会将%sxtra
和Inicializando...
捕获到第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 代码中提取字符串的正则表达式(不在注释内)的主要内容,如果未能解决你的问题,请参考以下文章