2017-02-10 163 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+字符比]\(佔有性匹配時,沒有回溯到模式)
  • ]其他 - 字面]符號(注它不需要在字符類外部轉義以表示字面右括號)