我正在尝试删除一堆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正则表达式测试人员),但由于某种原因无法在命令行上运行。感谢帮助。
答案 0 :(得分:2)
您需要使用perl
选项运行-0777
,以确保可以找到跨越行并匹配模式的内容。因此,使用perl -0777pi -e
代替perl -pi -e
将解决问题。
我还建议通过展开交替组来稍微优化模式,从而使匹配过程"线性":
s/P?C\[[^]\\]*(?:\\.[^]\\]*+)*]//sg
请注意,如果PC
应与整个词匹配,请在\b
之前添加P
。
模式详情:
P?C\[
- PC[
或C[
文字字符序列[^]\\]*
- 除\
和]
以外的零个或多个字符(?:\\.[^]\\]*+)*
- 零个或多个序列:
\\.
- 文字\
,然后是任何字符.
)[^]\\]*+
- 除]
和\
之外的0个字符(占有率匹配,不会回溯到模式中)]
- 文字]
符号(注意它不必在字符类之外转义以表示文字结束括号)