gpt4 book ai didi

regex - Perl 正则表达式匹配和删除

转载 作者:行者123 更新时间:2023-12-03 15:04:23 25 4
gpt4 key购买 nike

我有一个以 //#... 开头的字符串上升到换行符。我已经找出了这个 ..#([^\n]*) 的正则表达式.

我的问题是如果以下条件匹配,如何从文件中删除这一行

最佳答案

您的正则表达式在以下几点选择不当:

  • 不是专门匹配两个斜杠,而是使用 ..匹配两个可以是任何字符的字符,大概是因为当您还使用斜杠作为分隔符时,您不知道如何匹配斜杠。 (实际上,点几乎可以匹配任何东西,我们将在 #3 中看到。)

    在斜线分隔的正则表达式文字中,// ,您可以简单地通过用反斜杠保护它们来匹配斜杠,例如。 /\/\// .然而,更好的变体是使用更长形式的正则表达式文字,m// ,您可以在其中选择分隔符,例如。 m!! .由于您使用斜杠以外的其他东西进行分隔,因此您可以在不转义它们的情况下编写它们:m!//! .见 perldoc perlop .
  • 它没有 anchor 定到字符串的开头,所以它会匹配任何地方。使用 ^前面的字符串开头断言。
  • 你写了 [^\n]匹配“除换行符以外的任何字符”时有更简单的写法,这就是 .通配符。它正是这样做的——匹配除换行符之外的任何字符。
  • 您正在使用括号对匹配的一部分进行分组,但该组既没有量化(您没有指定它可以匹配任何其他次数而不是一次),您也没有兴趣保留它。所以括号是多余的。

  • 总而言之,这就是 m!^//#.*! .但是放一个未捕获的 .* (或任何带有 * 量词的)在正则表达式的末尾是没有意义的,因为它永远不会改变字符串是否匹配: *很高兴什么都不匹配。

    这样你就可以得到 m!^//#! .

    至于从文件中删除该行,正如其他人所解释的那样,逐行阅读并将所有要保留的行打印回另一个文件。如果您不在较大的程序中执行此操作,请使用 perl 的命令行开关轻松完成:
    perl -ni.bak -e'print unless m!^//#!' somefile.txt

    在这里, -n switch 使 perl 围绕您提供的代码进行循环,该代码将依次读取您在命令行上传递的所有文件。 -i switch(用于“就地”)表示从脚本中收集输出并用它覆盖每个文件的原始内容。 .bak -i 的参数选项告诉 perl 将原始文件的备份保存在以原始文件名命名的文件中 .bak附加。对于所有这些位,请参阅 perldoc perlrun .

    如果您想在较大程序的上下文中执行此操作,安全执行此操作的最简单方法是打开文件两次,一次用于读取,然后分别使用 IO::AtomicFile ,又是写作的时间。 IO::AtomicFile 只有在成功关闭时才会替换原始文件。

    关于regex - Perl 正则表达式匹配和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/80415/

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