2017-02-10 165 views
3

我试图删除一堆文件SGF所有的意见,并都拿出了下面的Perl命令: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

我看过的在线正则表达式测试人员都使用PCRE,而不是Perl正则表达式,所以结果不会n永远是一样的。另外,'/ m'修饰符是没用的,因为您不使用任何'^'或$''锚点;见[perlre](http://perldoc.perl.org/perlre.html#*m*)。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot啊,这样做更有意义。我仍然不知道如何完成这项工作。 – eukaryote

+0

当我在第一组示例上运行代码时,它可以正常工作。你能创建一个[mcve]吗? – ThisSuitIsBlackNot

回答

1

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

我也建议通过展开交替组,从而使得匹配过程“线性”优化模式的位:

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

注意,如果PC应作为一个整体词进行匹配,前加\bP

图案的详细资料

  • P?C\[ - 要么PC[C[文字字符序列
  • [^]\\]* - 零个或多个其它比\字符和]
  • (?:\\.[^]\\]*+)* - 零个或更多序列:
    • \\. - 字面\然后任何字符(.
    • [^]\\]*+ - 0+字符比]\(占有性匹配时,没有回溯到模式)
  • ]其他 - 字面]符号(注它不需要在字符类外部转义以表示字面右括号)