Perl不匹配正则表达式?

时间:2017-02-10 01:43:09

标签: regex perl

我正在尝试删除一堆SGF文件中的所有注释,并提出了以下perl命令:

perl -pi -e 's/P?C\[(?:[^\]\\]++|\\.)*+\]//gm' *.sgf

我正在尝试匹配并删除C或PC后跟左括号,然后是非右括号的字符(如果它们必须使用\进行转义)然后右键支架

我正在尝试匹配以下示例:

C[HelloBot9 [-\]: GTP Engine for HelloBot9 (white): HelloBot version 0.6.26.08]

PC[IA [-\]: GTP Engine for IA (black): GNU Go version 3.7.11
]

C[person [-\]: \\\]]

C[AyaMC [3k\]: GTP Engine for AyaMC (black): Aya version 6.61 : If you pass, AyaMC 
will pass. When AyaMC does not, please remove all dead stones.]

一些不应该匹配的例子:

XYZ[Other stuff \]]

C[stuff\]

PC[stuff\\\]

正则表达式适用于几个在线正则表达式测试人员(包括一些表明他们是perl正则表达式测试人员),但由于某种原因无法在命令行上运行。感谢帮助。

1 个答案:

答案 0 :(得分:2)

您需要使用perl选项运行-0777,以确保可以找到跨越行并匹配模式的内容。因此,使用perl -0777pi -e代替perl -pi -e将解决问题。

我还建议通过展开交替组来稍微优化模式,从而使匹配过程"线性":

s/P?C\[[^]\\]*(?:\\.[^]\\]*+)*]//sg

请注意,如果PC应与整个词匹配,请在\b之前添加P

模式详情

  • P?C\[ - PC[C[文字字符序列
  • [^]\\]* - 除\]以外的零个或多个字符
  • (?:\\.[^]\\]*+)* - 零个或多个序列:
    • \\. - 文字\,然后是任何字符.
    • [^]\\]*+ - 除]\之外的0个字符(占有率匹配,不会回溯到模式中)
  • ] - 文字]符号(注意它不必在字符类之外转义以表示文字结束括号)