.net 替换字符串中的整数值

.net 替换字符串中的整数值,.net,regex,.net,Regex,我有一个包含一些ID的字符串,基本上是字符串中的sql表达式。我需要以一种更友好的方式将其呈现给用户,即用数据库中的名称替换ID。问题是有些ID是个位数,有些是2位数。因此,当我搜索并替换一个单个数字时,它也会替换部分2位字符串。例如,如果原始字符串为: id not in (2, 3, 4) and id > 22 当我搜索并替换2时,数字2和22都会被替换 使用正则表达式,我可以找到2,但当我替换它时(正则表达式基本上查找我想要的数字和一些可能的分隔符,如空格,()等等)。是

我有一个包含一些ID的字符串,基本上是字符串中的sql表达式。我需要以一种更友好的方式将其呈现给用户,即用数据库中的名称替换ID。问题是有些ID是个位数,有些是2位数。因此,当我搜索并替换一个单个数字时,它也会替换部分2位字符串。例如,如果原始字符串为:

    id not in (2, 3, 4) and id > 22
当我搜索并替换
2
时,数字
2
22
都会被替换

使用正则表达式,我可以找到
2
,但当我替换它时(正则表达式基本上查找我想要的数字和一些可能的分隔符,如空格
,()
等等)。是否可以替换此数字,但保留这些分隔符

这就是我现在拥有的:

Regex.Replace(returnValue
               , String.Format("[,( )]{0}[,( )]", number)
               , replaceValue)
像这样的

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  + "<<";
}
string input=“id不在(2,3,4)中,id>22”;
var newstr=Regex.Replace(输入@“\d+”,m=>GetUserName(m.Value));
字符串GetUserName(字符串s)
{

return“>>”+s+”将您的正则表达式更改为用户向前看和向后看-因此您的模式如下所示

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

”(?您需要使用负环视,如下所述:

例如:

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

string result=Regex.Replace(input,@“(?22”

I4V建议的模式对我来说看起来最简单、也很好,但您也可以尝试以下模式:

(\d+)(?=[,\)])
这种模式背后的思想是,有时我们在
列名中有数字,比如
Address1
Address2
,因此使用它也会与它们匹配。这种模式不允许出现这种情况

希望这会有帮助

编辑

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());

@Bidou你可以在
GetUserName
中做任何你想做的事。甚至可以返回原始字符串。
GetUserName
不必是一行代码。我的意思是你的正则表达式将匹配数字22,这不是OP想要的(如果我理解这个问题的话)对我来说是一样的(如果我理解这个问题的话)。但是我要说的是,即使正则表达式匹配,也不必替换它。将这一行添加到
GetUserName
中,对于ex,
如果(s.Length==2)返回s;
确切地说,我现在的问题是我有值2、22和222,我只需要替换2(这些是ID)。我创建了只匹配2的正则表达式,但当replacingI必须询问您为什么要这样做时,它会在它前面和后面吃字符?我需要保存一个表达式,稍后用于过滤数据,并且我需要能够以尽可能友好的方式向用户显示它。您是否对照:
id not in(25、26、27)id>237
似乎我误解了这个问题。我认为目标是只匹配包含一个数字的数字。问题中的示例(带2和22)误导我…目标是匹配准确的数字,而不是包含它的数字,因此22和2222会造成相同的问题。我的想法是使用正则表达式匹配我想要的数字,并检查前后是否有非数字字符。这有助于我调整代码和解析的表达式,以便我能够使用更简单的解析和使用这些字符例如,我做了一些有效的东西(到目前为止)
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 not in (5, 6, 7) and id > 22