6

次の文字列を取得する必要があります。

book_id = ? and author_id = ? and publisher_id = ?

それを次の文字列に変換します。

book_id = @p1 and author_id = @p2 and publisher_id = @p3

このコードを使用して:

Regex.Replace(input, @"(\?)", "@p **(index of group)**");

グループのインデックスを取得するための置換パターンは何ですか?

4

5 に答える 5

7

カウンタ変数とともに を受け取るRegex.Replaceメソッドを使用できます。MatchEvaluator

string input = "book_id = ? and author_id = ? and publisher_id = ?";
string pattern = @"\?";
int count = 1;
string result = Regex.Replace(input, pattern, m => "@p" + count++);

m =>パーツはMatchEvaluator. この場合、Match( is m);を使用する必要はありません。連結された結果を返し、カウンターをインクリメントしたいだけです。

于 2013-03-05T00:59:21.140 に答える
0

StringBuilder を使用した私のソリューションは悪くはありませんが、最速でもエレガントでもありません:(

var count = 1;
var sb = new StringBuilder(input);
for (int i = 0; i < sb.Length; i++)
{
    if (sb[j] == '?')
    {
        sb.Remove(i, 1);
        sb.Insert(i, "@p" + (count++));
        i += 3;
    }
}
result = sb.ToString();
于 2013-03-05T03:52:41.410 に答える
0

1行のソリューションが必要な場合は、次のようにすることができますが、「?」のカウントを見つける必要があるため、大きな文字列の場合は遅くなる可能性があります。試合ごとに

 var result = Regex.Replace(input, @"\?", m => "@p" + input.Take(m.Index).Count(c => c == '?'));

戻り値"book_id = @p0 and author_id = @p1 and publisher_id = @p2"

これは、外部変数を宣言せずに indext を取得する唯一の方法です。

于 2013-03-05T00:59:29.173 に答える
0

何かありそうな予感…

アイデアは、最初に、インデックスを作成するすべての場所にすべてのインデックスを配置することです。

Ñ123456Ñ

この例では、合計 6 つの項目が索引付けされるため、Ñ (またはルックアップ・テキストのどこにもない他の文字) で囲まれた 6 までの数字のすべてです。

次に、正規表現が開始点を持つように、手動で最初の '1' を作成します。これにより、アルゴリズムは最後にインデックス付けされたものを見つけ、それを使用して次のインデックスを決定できます。

探す: (Ñ)([0-9])(Ñ)(([^Ñ]|\r?\n)*?)(Ñ)([0-9]*)\2([0-9])([0-9]*)(Ñ)

交換: $1$2$3$4$6$8$10

テキストの例:

Ñ1Ñ
Ñ123456Ñ
Ñ123456Ñ
Ñ123456Ñ
Ñ123456Ñ
Ñ123456Ñ

1回交換後:

Ñ1Ñ
Ñ2Ñ
Ñ123456Ñ
Ñ123456Ñ
Ñ123456Ñ
Ñ123456Ñ

再度交換した後:

Ñ1Ñ
Ñ2Ñ
Ñ3Ñ
Ñ123456Ñ
Ñ123456Ñ
Ñ123456Ñ

「すべて置換」機能は、1 つずつ検索して置換する必要があるため、これには機能しませんが、仕事は完了すると思います。

次に、すべての一時的な Ñ 文字を削除するだけで済みます。

免責事項:「中間」テキストの改行に対処する部分 - \r?\n- は Atom エディターで動作するように作成されているため、他の状況では微調整が必​​要になる場合があります。に含まれているため、実際には完全に削除できる[^Ñ]と思いますが、他のシステムで機能するかどうかはわかりません。


2 桁以上のインデックスの場合:

探す: (Ñ)([0-9]{2})(Ñ)(([^Ñ]|\r?\n)*?)(Ñ)([0-9][0-9])*\2([0-9]{2})([0-9][0-9])*(Ñ)

交換: $1$2$3$4$6$8$10

テキストの例:

Ñ01Ñ
Ñ0102030405060708091011121314151617Ñ
Ñ0102030405060708091011121314151617Ñ
Ñ0102030405060708091011121314151617Ñ
...
于 2021-09-13T11:12:18.023 に答える
-1

未テスト:

int n, i=1; while( (n=input.IndexOf("?")) != -1) { input = input.Substring(0,n-1) + "@p" + (++i) + input.Substring(n+1); }

長めのラインですが、完全に不合理ではありません。

于 2013-03-05T00:49:07.290 に答える