【问题标题】:Replacing whole values within a string替换字符串中的整个值
【发布时间】:2013-05-23 19:36:22
【问题描述】:

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

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

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

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

这就是我现在拥有的:

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

【问题讨论】:

  • 我不得不问你为什么要这样做?
  • 我需要保存一个表达式,稍后将用于过滤数据,并且我需要能够以尽可能友好的方式向用户显示它。

标签: .net regex


【解决方案1】:

这样的?

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  + "<<";
}

【讨论】:

  • @Bidou 你可以在GetUserName 中为所欲为。甚至返回原始字符串。 GetUserName 不必是一行代码。
  • 我的意思是您的正则表达式将匹配数字 22,这不是 OP 想要的(如果我很好地理解了这个问题)
  • 对我来说也是如此(如果我很好地理解了这个问题)。但是我说的是,即使正则表达式匹配,您也不必替换它。将此行添加到GetUserName,例如if(s.Length==2) return s;
  • 没错,我现在遇到的问题是我的值是 2、22 和 222,我只需要替换 2(这些是 id)。我创建了只匹配 2 的正则表达式,但是在替换时它会吃掉前面和后面的字符
【解决方案2】:

I4V 建议的模式对我来说看起来既简单又好用,但你也可以试试这个模式:

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

这种模式背后的想法是,有时我们在column names 中有数字,例如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

【讨论】:

  • 这有帮助,我调整了我的代码和被解析的表达式,因此我能够使用更简单的解析,并且通过这些示例我做了一些有效的东西(到目前为止)
【解决方案3】:

将您的正则表达式更改为用户向前看,向后看 - 所以您的模式看起来像这样

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

或者如果你喜欢你的代码示例

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

所以我们说:

(?&lt;=[^0-9]) 查看我们匹配的项目并确保它不是整数

{0} 匹配项

(?=[^0-9]) 向前看我们匹配的项目并确保它不是整数

【讨论】:

    【解决方案4】:

    您需要使用此处所述的否定环视: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"

    【讨论】:

    • 你检查过吗:id not in (25, 26, 27) and id &gt; 237
    • 看来我误解了这个问题。我认为目标是只匹配包含一位数字的数字。问题中的示例(带有 2 和 22)误导了我...
    • 目标是匹配确切的数字,而不是包含它的数字,所以 22 和 2222 会造成同样的问题。我的想法是匹配我想要的数字的正则表达式,并检查非数字字符是否在之前和之后
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多