6

MVC3 プロジェクトを T4MVC を使用するように変換しています。また、T4MVC でも動作するように java-script インクルードを置き換えたいと思います。だから交換すればいい

"~/Scripts/DataTables/TableTools/TableTools.min.js"
"~/Scripts/jquery-ui-1.8.24.min.js"

の中へ

Scripts.DataTables.TableTools.TableTools_min_js
Scripts.jquery_ui_1_8_24_min_js

現在、正規表現ツールとして Notepad++ を使用しており、POSIX 正規表現を使用しています。スクリプト名を見つけて、次の正規表現に置き換えることができます。

探す:\("~/Scripts/(.*)"\)

と置換する\(Scripts.\1\)

しかし、ファイル名のドットとダッシュをアンダースコアに置き換え、スラッシュをドットに置き換える方法がわかりません。

これで、js-filename の名前にドットまたはダッシュが含まれていることを確認できます

 \("~/Scripts/(?=\.*)(?=\-*).*"\)

しかし、グループ内でグループを置き換えるにはどうすればよいでしょうか?

グループ内に貪欲でない置換が必要であり、これらの置換を順番に実行する必要があるため、ドットに変換されたスラッシュは後でアンダースコアに変換されません。

これは重要ではない問題です。私はすでにすべての置換を手動で行っていますが、私は正規表現が得意だと思っていたので、この問題は私を悩ませています!!

ps 推奨ツールは Notepad++ ですが、POSIX regexp ソリューションならどれでも構いません -)

ppsここに置換 対象のサンプルが表示されます。これがターゲット テキストです。

4

4 に答える 4

3

質問が示すように、N ++を使用したい場合は、N++Pythonスクリプトを使用してください。スクリプトを設定し、ショートカットキーを割り当てると、開いて変更し、保存するだけでよいシングルパスソリューションが得られます...それよりもはるかに簡単になることはできません。

問題の一部は、N ++が正規表現ツールではなく、専用の正規表現ツールの使用、または検索/置換ソリューションでさえも保証される場合があることだと思います。テキスト処理と編集用に作成されたツールを使用すると、速度と時間の両方の点で優れている場合があります。

[スクリプト編集]::変更されたイン/アウトの期待に一致するように変更されました。

# Substitute & Replace within matched group.
from Npp import *
import re

def repl(m):
    return "(Scripts." + re.sub( "[-.]", "_", m.group(1) ).replace( "/", "." ) + ")"

editor.pyreplace( '(?:[(].*?Scripts.)(.*?)(?:"?[)])',  repl )
  1. インストール::プラグイン->プラグインマネージャー->Pythonスクリプト
  2. 新しいスクリプト::プラグイン->Pythonスクリプト->script-name.py
  3. ターゲットタブを選択します。
  4. 実行::プラグイン->Pythonスクリプト->スクリプト->スクリプト名

[編集:拡張ワンライナーPythonScriptコマンド]

Python用の新しい正規表現モジュールが必要になったので(reの代わりになることを願っています)、N ++ PythonScriptプラグインで使用するために試してコンパイルし、サンプルセットでテストすることにしました。

コンソールの2つのコマンドは、エディターで正しい結果になりました。

import regex as re
editor.setText( (re.compile( r'(?<=.*Content[(].*)((?<omit>["~]+?([~])[/]|["])|(?<toUnderscore>[-.]+)|(?<toDot>[/]+))+(?=.*[)]".*)' ) ).sub(lambda m: {'omit':'','toDot':'.','toUnderscore':'_'}[[ key for key, value in m.groupdict().items() if value != None ][0]], editor.getText() ) )

とても甘い!

regex代わりに使用することで他に本当にクールreなのは、Expressoで式を作成し、それをそのまま使用できることです。r''これにより、文字列部分をExpressoにコピーアンドペーストするだけで、詳細な説明が可能になります。

その省略テキストは次のとおりです。

Match a prefix but exclude it from the capture. [.*Content[(].*]
[1]: A numbered capture group. [(?<omit>["~]+?([~])[/]|["])|(?<toUnderscore>[-.]+)|(?<toDot>[/]+)], one or more repetitions
    Select from 3 alternatives
         [omit]: A named capture group. [["~]+?([~])[/]|["]]
             Select from 2 alternatives
                 ["~]+?([~])[/]
                 Any character in this class: ["]
         [toUnderscore]: A named capture group. [[-.]+]
         [toDot]: A named capture group. [[/]+]
Match a suffix but exclude it from the capture. [.*[)]".*]

コマンドの内訳はかなり気の利いたものです。空ではないグループの名前の「スイッチ」を基本的に使用して、コンパイルされた正規表現置換コマンドの結果に完全なバッファーの内容を設定するようにScintillaに指示しています。

うまくいけば、Dave(PythonScript作成者)がプロジェクトのExtraPythonLibs部分に正規表現モジュールを追加します。

于 2012-10-10T23:24:34.057 に答える
3

RegexHeroのようなサイトを使用するだけです

  1. コードをターゲット文字列ボックスに貼り付けてから(?<=(~/Script).*)[.-](?=(.*"[)]"))Regular Expressionボックス_ 内に配置できReplacement Stringます。

  2. 置換が完了したら、Final String下部にある をクリックし、 を選択しますMove to target string and start a new expression

  3. そこから、ボックスに貼り付け(?<=(<script).*)("~/)(?=(.*[)]" ))|(?<=(Url.).*)(")(?=(.*(\)" )))て、ボックスを空 Regular Expressionのままにします。Replacement String

  4. 置換が完了したら、Final String下部にある をクリックし、 を選択しますMove to target string and start a new expression

  5. そこから(?<=(Script).*)[/](?=(.*[)]"))ボックスRegular Expressionとボックス.に貼り付けReplacement Stringます。

その後、Final String箱にはあなたが探しているものが入っています。解析できるテキストの上限はわかりませんが、それが問題になる場合は分割される可能性があります。もっと良い方法があるかもしれませんが、これは私がこのようなことをする方法です。私がこのサイトを気に入っている理由の 1 つは、何もインストールする必要がないため、どこでもすぐに実行できることです。

/編集 1: コメントに従って、ステップ 3 をステップ 5 に移動し、新しいステップ 3 と 4 を追加しまし"~/Scriptsた。また、変更された開始を考慮して、ステップ 5 のコードを変更する必要がありました。."~/Script

于 2012-10-11T00:23:04.613 に答える
3

これはバニラの Notepad++ ソリューションですが、確かに最も洗練されたものではありません。ファイルを数回パスして変換を行うことができました。

最初のパス

.-を に置き換え_ます。

探す:("~/Scripts[^"]*?)[.-]

と置換する:\1_

残念ながら、 or のみを一致させる方法を見つけることができませんでした。これ、明らかに Notepad++ ではサポートされていない後読みが必要になるためです。このため、置換を実行するたびに、最初またはスクリプト名のみが置換されます (一致が重複できないため)。したがって、置換が行われなくなるまで、この置換を複数回実行する必要があります (入力例では、8 回になります)。.-.-

セカンドパス

に置き換え/ます.

探す:("~/Scripts[^"]*?)/

と置換する:\1.

これは、文字が異なるだけで、基本的に最初のパスと同じです (サンプル ファイルでは、これを 3 回実行する必要があります)。この順序でパスを実行すると、スラッシュがアンダースコアになることはありません。

3 回目のパス

周囲の文字を削除します。

探す:"~/(Scripts[^"]*?)"

と置換する:\1

これにより、まだ"~/andで囲まれているすべてのスクリプト名が一致し"、その間にあるものをキャプチャして出力するだけになります。

最初の 2 つのパスの検索パターンに周囲の文字を含めることで、.既に新しい形式になっている文字列の変換を回避できることに注意してください。

私が言ったように、これは最も便利な方法ではありません。特に、パス 1 と 2 は手動で複数回実行する必要があるためです。しかし、それでも大きなファイルの場合は多くの時間を節約できます。また、後読み機能を使用せずに、1 回のパスですべてのファイル (正しい文字列のみ) を取得する方法を思いつきません。もちろん、このソリューションを改善するための提案を大歓迎します:)。少なくともあなた (および同様の問題を抱えている人) に出発点を提供できれば幸いです。

于 2012-10-10T21:28:38.427 に答える
2

または、それを行うスクリプトを使用して、コピーの貼り付けと残りの手作業を完全に回避することもできます。次のスクリプトの使用を検討してください。

$_.gsub!(%r{(?:"~/)?Scripts/([a-z0-9./-]+)"?}i) do |i| 
    'Scripts.' + $1.split('/').map { |i| i.gsub(/[.-]/, '_') }.join('.')
end

そして、次のように実行します。

$ ruby -pi.bak script.rb *.ext

拡張子を持つすべてのファイルは.extその場で編集され、元のファイルは.ext.bak拡張子付きで保存されます。リビジョン管理を使用している場合 (そうすべきです)、視覚的な差分ツールを使用して変更を簡単に確認し、必要に応じて修正し、後でコミットすることができます。

于 2012-10-12T14:30:14.790 に答える