0

基本的に文字列内のSQL式である、いくつかのIDを含む文字列があります。よりフレンドリーな方法でユーザーに提示する必要があります。ID をデータベースの名前に置き換えます。問題は、1 桁の ID と 2 桁の ID があることです。そのため、1 桁を検索して置換すると、 2 桁の文字列の一部も置換されます。たとえば、元の文字列が次の場合:

    id not in (2, 3, 4) and id > 22

の検索と置換を実行すると2、数字2と両方22が置換されます。

正規表現で見つけることができます2が、それを置き換えると(正規表現は基本的に、必要な数値と、スペース,()などの可能な区切り文字を探します)。この数字を置き換えることは可能ですが、区切り文字はそのままにしておきますか?

これは私が今持っているものです:

Regex.Replace(returnValue
               , String.Format("[,( )]{0}[,( )]", number)
               , replaceValue)
4

4 に答える 4

2

このようなもの ?

string input = "id not in (2, 3, 4) and id > 22";
var newstr = Regex.Replace(input, @"\d+", m => GetUserName(m.Value));


string GetUserName(string s)
{
    return ">>" + s  + "<<";
}
于 2013-05-22T13:25:09.373 に答える
0

I4Vによって提案されたパターンは、私には最もシンプルで素晴らしいように見えますが、次のパターンを試すこともできます。

(\d+)(?=[,\)])

このパターンの背後にある考え方は、column nameslikeに数字がある場合があるためAddress1Address2それを使用するとそれらにも一致するということです。このパターンでは、これらのケースは許可されません。

それが役立つことを願っています!

編集

List<int> replacements = new List<int>(new int[] { 5 , 6 , 7});
string input = "id not in (2, 3, 4) and id > 22";

foreach(int element in replacements)
   input = Regex.Replace(input,@"(\d+)(?=[,\)])",element.ToString());

ここ:

ID 2 は 5 に置き換えられ、3 は 6 に置き換えられ、4 は 7 に置き換えられます。したがって、最終的な文字列は次のようになります。

id not in (5, 6, 7) and id > 22
于 2013-05-22T13:58:33.780 に答える
0

ここで説明されているように、否定的なルックアラウンドを使用する必要があります:特殊文字を使用しない 10 桁の数字の正規表現

あなたの例:

const string input = "id not in (2, 3, 4) and id > 22";
string result = Regex.Replace(input, @"(?<!\d)(\d{1})(?!\d)", @"--$1--");

そして結果:

「id が (--2--, --3--, --4--) になく、id > 22」

于 2013-05-22T13:41:04.937 に答える
0

正規表現をユーザールックアヘッドとルックビハインドに変更します-パターンは次のようになります

"(?<=[^0-9]){0}(?=[^0-9])"

または、コード例が気に入ったら

Regex.Replace(returnValue
    , String.Format("(?<=[^0-9]){0}(?=[^0-9])", number)
    , replaceValue)

つまり、次のように言っています。

(?<=[^0-9])一致したアイテムの後ろを見て、それが整数でないことを確認してください

{0}マッチしたアイテム

(?=[^0-9])一致したアイテムを先読みして、それが整数でないことを確認してください

于 2013-05-22T13:37:26.143 に答える