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