12

コメントのあるメソッドのパブリックメソッドを保護されたメソッドに置き換えようとしています。

これは、phpunitを使用してこれらのメソッドの一部をテストしているためですが、実際にはパブリックである必要はないため、本番サーバーでそれらを切り替えて、テスト時に元に戻したいと思います。

メソッド宣言は次のとおりです。

public function extractFile($fileName){ //TODO: change to protected

これは正規表現です:

(?<ws>^\s+)(?<pb>public)(?<fn>[^/\n]+)(?<cm>//TODO: change to protected)

私がそれを置き換える場合:

\1protected\3\//TODO: change back to public for testing

動作しているように見えますが、動作させることができないのは、replaceをに名前を付けることです。最初のグループを取得するには、\1を使用する必要があります。置換テキストでグループにアクセスできないのに、なぜグループに名前を付けるのですか?<ws>、$ ws、$ wsのようなものを試しましたが、うまくいきません。

\ 1を<ws>という名前のグループに置き換えたい場合の置き換えテキストは何ですか?

4

1 に答える 1

11

名前?<ws>付きグループの構文は、.NET/Perlで使用されているものと同じです。これらの正規表現エンジンの場合、名前付きグループの置換文字列参照はです${ws}。これは、置換文字列が次のようになることを意味します。

${ws}protected${fn}\//TODO: change back to public for testing

\k<ws>m.buettnerによって言及された参照は、実際の正規表現の後方参照にのみ使用されます。

追加情報:

Geanyはグループという名前のPythonスタイルの使用も許可しているようです。

  • ?P<ws>キャプチャ構文です
  • \g<ws>置換文字列構文です
  • (?P=ws)正規表現の後方参照構文です

編集:

解決策への私の希望はうまくいきませんでした。マニュアルから、

サブパターンには、Perlの場合は(?...)または(?'name' ...)、Pythonの場合は(?P ...)の3つの方法のいずれかで名前を付けることができます。後方参照、再帰、条件など、パターンの他の部分から括弧をキャプチャするための参照は、番号だけでなく名前でも行うことができます。

そしてさらに下に:

名前付きサブパターンへの逆参照では、Perl構文\kまたは\k'name'またはPython構文(?P = name)を使用します。

名前で参照されるサブパターンは、参照の前後のパターンに表示される場合があります。

したがって、名前付きグループを使用するための構文の私の推論は正しかった。残念ながら、それらはマッチングパターンでのみ使用できます。それはあなたの質問「なぜグループに名前を付けるのか...?」に答えます。

これはどれほど愚かですか?名前付きグループとその使用法を一致パターンで実装するためにすべての問題に取り組む場合は、置換文字列でも使用法を実装してみませんか?

于 2013-01-21T20:09:47.030 に答える