gpt4 book ai didi

RegEx:抓取引号之间的所有文本(包括嵌套),除非在注释行中(以//开头)

转载 作者:行者123 更新时间:2023-12-02 04:24:47 29 4
gpt4 key购买 nike

我正在尝试组合一个表达式,该表达式将抓取引号(单引号或双引号)之间的文本,包括嵌套引号中的文本,但会忽略注释中的文本,因此除非该行以//开头。

代码示例:

// this is a "comment" and should be ignored
//this is also a 'comment' and should be ignored

printf("This is text meant to be "captured", and can include any type of character");
printf("This is the same as above, only with 'different' nested quotes");

这对于从文件中提取可翻译的内容非常有用。

到目前为止,我已经成功地使用了 ^((?!\/\/).)*从导入中排除注释行,以及 ["'](.+)["']提取引号之间的文本,但我无法将其组合到单个表达式中。
按顺序运行它们也不起作用,我认为是因为第一个表达式中的贪婪量词。

最佳答案

没有写关于输入文件的类型,所以我假设 C 源代码文件。

我建议遵循使用文本编辑器 UltraEdit 测试的正则表达式,它使用
Boost C++ Perl regular expression library .

^(?:(?!//|"|').)*(["'])(?!\1)\K(?:\\\1|.)+?(?=\1)

它匹配 第一 一行中的单引号或双引号字符串。在 Perl 语法中,此正则表达式搜索字符串将忽略同一行上的其他字符串,这不是最佳的。

它忽略以 // 开头的行注释中的单引号或双引号字符串。独立的在线注释位于一行的开头,没有或有前导空格/制表符或代码后一行的其他地方。

它也忽略空字符串,如 ""'' .如果一行包含第一个 ""''第二个单引号或双引号非空字符串,非空字符串也被忽略。这不是最优的。

字符串分隔符在匹配字符串的两边都不匹配。

字符串定界符必须用反斜杠字符转义,以便此搜索表达式将其解释为字符串内的文字字符。第一 printf在有问题的示例中,肯定会导致 C 编译器编译时出现语法错误。

由于预处理器宏,块注释中的字符串不会被此表达式忽略,代码中的字符串也被编译器忽略。

例子:
// This is a "comment" and should be ignored.
//This is also a 'comment' which should be ignored.
printf("This is text meant to be \"captured\", and can include any type of character.\n"); // But " must be escaped with a backslash.
printf("This is the same as above, only with 'different' nested quotes.\n");
putchar('I');
putchar('\'');
printf(""); printf("m thinking."); // First printf is not very useful.
printf("\"OK!\"");
printf("Hello"); printf(" world!\n");
printf("%d file%s found.\n",iFileCount,((iFileCount != 1) ? "s" : "");
printf("Result is: %s\n",sText); // sText is "success" or "failure".
return iReturnCode; // 0 ... "success", 1 ... "error"

搜索表达式与此示例匹配:
This is text meant to be \"captured\", and can include any type of character.\n
This is the same as above, only with 'different' nested quotes.\n
I
\'
\"OK!\"
Hello
%d file%s found.\n
Result is: %s\n

因此它不会在运行 C 代码示例时找到所有非空字符串输出。

搜索字符串说明:
  • ^ ... 在一行的开头开始搜索。
    这就是不能在不在行注释中的行上与此表达式 second,third, ... 字符串匹配的主要原因。
  • (?:(?!//|"|').)* ... 使用非标记组搜索零个或多个字符而不是换行符,下一个没有 //也不是 "也不是 '使用包含 OR 表达式的否定前瞻进行验证。
    此表达式负责忽略 // 之后的所有内容曾经因为
  • 在一行中发现
  • (["']) ... "'必须找到下一个,找到的字符被标记为反向引用。
  • (?!\1) ...但如果下一个字符不是忽略空字符串的相同字符,则匹配仅是正数。
  • \K ... 重置 $0 的起始位置到当前文本位置:换句话说,\K 左侧的所有内容被“保留”并且不构成正则表达式匹配的一部分。所以从行首到 " 一切都匹配或 '在非空字符串的开头不再匹配(选择)。
  • (?:\\\1|.)+? ...非标记组以查找反斜杠和字符串开头的字符或任何不是换行符非贪婪一次或多次的字符。
    此表达式匹配感兴趣的字符串。
  • (?=\1) ... 匹配不是换行符的任何字符应该在下一个字符(正向前瞻)处停止,该字符是相同的引号字符,不会在字符串的开头使用反斜杠进行转义,而不匹配此引号字符。

  • 配套 第一 行注释外的非空字符串,两边都有定界符:

    ^(?:(?!//|"|').)*\K(["'])(?!\1)(?:\\\1|.)+?\1

    如何获得评论之外的所有非空字符串?
  • 将整个 C 源代码文件的内容复制到一个新文件中。
  • 在新文件中使用搜索表达式删除所有未嵌套的块注释和所有行注释:^[\t ]*//.*[\r\n]+|[\t ]*/\*[\s\S]+?\*/[\r\n]*|[\t ]*//.*$替换字符串是一个空字符串。
    注://字符串内部由 OR 表达式的第三部分也解释为行注释的开头,尽管这不正确。
  • 用作搜索字符串 (["'])(?!\1)(?:\\\1|.)+?\1找到真正所有非空字符串,并匹配每个字符串两侧的字符串定界符。

  • 最好用用 C 编写的非空字符串程序解析 C 源代码文件,因为这样的程序可以更好地找出什么是行注释,什么是块注释,甚至在包含嵌套块注释的源代码文件上,什么是非空字符串。好吧,也可以让 C 编译器只预处理项目的 C 源代码文件,在预处理后生成输出文件,所有行和块注释都已删除,并在这些预处理文件中搜索非空字符串。

    关于RegEx:抓取引号之间的所有文本(包括嵌套),除非在注释行中(以//开头),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55732390/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com