2017-02-10 12 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

私が見たオンライン正規表現テスターは、Perl正規表現ではなくPCREを使用しているため、結果はn個ではありませんecessarily同じです。また、 '^'や '$'アンカーを使わないので、 '/ m'修飾子は無用です。 [perlre](http://perldoc.perl.org/perlre.html#*m*)を参照してください。 – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackいいえ、それは意味があります。私はまだこの作業をどうするか考えていない。 – eukaryote

+0

例の最初のセットでコードを実行すると、そのコードは機能します。 [mcve]を作成できますか? – ThisSuitIsBlackNot

答えて

1

-0777オプションを指定してperlを実行する必要があります。これにより、内容が線をまたいで一致し、パターンに一致することが確認できます。したがって、perl -pi -eの代わりにperl -0777pi -eを使用すると問題が解決します。

Iはまた、マッチング処理を行う、したがって、「線形」交替基をアンロールすることによってパターンを少し最適化を示唆している:PCが単語全体として一致させる必要がある場合、前\bを追加すること

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

P

パターンは詳細:

  • P?C\[ - のいずれかPC[又はC[リテラル文字列
  • [^]\\]* - ゼロ以上\以外の文字と]
  • (?:\\.[^]\\]*+)* - ゼロ以上の配列:
    • \\. - リテラル\、次いで任意CHAR(.
    • [^]\\]*+ - 0+ ]以外の文字と\(possessively一致し、パターンにないバックトラッキング)
  • ] - リテラル]シンボル(注
関連する問題