0

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

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

当我执行搜索和替换时2,数字222都被替换。

使用正则表达式我可以找到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

您需要使用此处解释的否定环视:Regular expression for 10 digit number without any special characters

对于您的示例:

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

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 替换。所以 finall 字符串看起来像:

id not in (5, 6, 7) and id > 22
于 2013-05-22T13:58:33.780 回答
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 回答