4

私は、PHP ファイルの内容を取得して変数に格納するアプリケーションを開発している学生です。

ユーザーは、ロードされたコンテンツで置換する必要がある文字/値を入力します。

例えば ​​:

FIND           REPLACE
echo           Print
<?php          <?
CURL           (space)

これらのパターンは、後で使用するためにテキスト ファイルに保存できます。ユーザーがパターンに従ってコンテンツを削除したい場合は、ボタンをクリックして削除できます。

だから私の質問は:

これは、基本的な文字列置換メソッドを使用して簡単にアーカイブできますか?それとも、より複雑な正規表現を使用する必要がありますか?

また、正規表現を使用する必要がある場合、ユーザー入力に基づいてカスタム正規表現パターンを作成するにはどうすればよいですか?

これで私を助けてくれるなら、私はとても感謝しています、ありがとう。

4

5 に答える 5

3

これは単純に を使用して実現できReplaceますが、そのような精巧な要件を処理する正規表現は面倒であるだけでなく、追加のアイテムで維持/更新するのが非常に困難です。

検索と置換のパターンを a に保存してDictionaryから、ループして置換を実行するのはどうですか? そうすれば、さらにアイテムを追加する場合は、Dictionary. 何かのようなもの:

Dictionary<string, string> replacements = new Dictionary<string, string>
                                          {
                                              { "echo", "PRINT" },
                                              { "<?php", "<?" },
                                              { "CURL", "(space)" }
                                          }

string yourString; //this is your starter string, populate it with whatever

foreach (var item in replacements)
{
    yourString = yourString.Replace(item.Key, item.Value);
}
于 2013-03-13T15:23:42.163 に答える
3

これまでに見た回答のどれも、反復アプローチが元のソースにはなかった FIND 値と一致しないように注意することについて言及していません (たとえば、最初のループは に置き換えechoられますPrintが、ループ 2 はint( new 内からPrint、例えばInt32leaveで)置き換えPrInt32ます。

非常に単純な正規表現を使用して、単語全体を置き換えるだけであることを確認する方が「安全」かもしれません。これにより、少なくとも上記の例から保護されます。

たとえば、ユーザー指定の文字列を検索する代わりに、intそれを正規表現の単語境界でラップし、代わりに検索します\bint\b(もちろん、これが対象ファイルに含まれる可能性のある演算子で機能すること、または指定されたものに適していることを確認するには、慎重なテストが必要です)検索文字列の種類など)。次に、これをオプションとして提供できます (ほとんどのテキスト編集ソフトウェアが「完全な単語のみに一致」オプションを提供するのと同様)。

また、同じ置換で同じ検索ターゲットを反復しないようにする必要があります。たとえば、それ<?がならないことを確認し<?php、後でなる<?<?phpなど. .

于 2013-03-13T15:30:35.067 に答える
3

特定の文字列内の文字セットを別の文字セットに単純に置き換えようとしている場合は、このstring.Replace()方法が適しています。

プログラマーの目標は、特定のタスクに対して可能な限り単純なコードを作成することです。正規表現はコンテキスト置換に適していますが、基本的な検索と置換機能だけが必要な場合、それらは間違いなく過剰であり、プログラムに不必要な複雑さを導入するだけです。

于 2013-03-13T15:23:24.190 に答える
1

Replace辞書を使用して、より簡単に繰り返し呼び出すことができます。

var replacements = new Dictionary<string, string>();
replacements.Add("echo", "print");
replacements.Add("<?php", "<?");
...

foreach(var pair in replacements)
{
    myString = myString.Replace(pair.Key, pair.Value);
}

または、Linq のAggregate方法を使用します。

myString = replacements.Aggregate(myString, (s, p) => s.Replace(p.Key, p.Value));

これは単純な文字列に対して機能しますが、同じ一般的な設計を正規表現パターンにも使用できます。

var replacements = new Dictionary<string, string>();
...

foreach(var pair in replacement)
{
    myString = new RegEx(pair.Key).Replace(myString, pair.Value);
}

そして再びLinqで:

myString = replacements.Aggregate(myString, (s, p) => new RegEx(pair.Key).Replace(s, p.Value));
于 2013-03-13T15:23:38.107 に答える
0

繰り返し使用String.Replaceするのが最も簡単な方法ですが、最速ではありません。私はほとんどその方法を最初に試してから、正規表現の使用に切り替えるのに十分な速さがない場合にのみ試してみました。ただし、置換テキストが検索フラグメントの 1 つと一致する可能性があることに注意する必要があります。

Regex.Escape正規表現を使用するには、各文字列を検索してから、エスケープされたすべてのパターンを「|」を使用して連結する必要があります。区切りとして。Regex.Replace次に、 a を使用してシングルを実行MatchEvaluatorして、置換を検索できます。

于 2013-03-13T15:23:07.833 に答える