当前位置:  开发笔记 > 编程语言 > 正文

如何在.NET中替换字符串的*first instance*?

如何解决《如何在.NET中替换字符串的*firstinstance*?》经验,为你挑选了7个好方法。

我想替换给定字符串中的第一个匹配项.

我怎样才能在.NET中实现这一目标?



1> VVS..:
string ReplaceFirst(string text, string search, string replace)
{
  int pos = text.IndexOf(search);
  if (pos < 0)
  {
    return text;
  }
  return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}

例:

string str = "The brown brown fox jumps over the lazy dog";

str = ReplaceFirst(str, "brown", "quick");

编辑:正如@itsmatt 提到的,还有Regex.Replace(String,String,Int32),它可以做同样的事情,但在运行时可能更贵,因为它使用的是一个功能齐全的解析器,我的方法可以找到一个和三个字符串级联.

EDIT2:如果这是一项常见任务,您可能希望将该方法作为扩展方法:

public static class StringExtension
{
  public static string ReplaceFirst(this string text, string search, string replace)
  {
     // ...same as above...
  }
}

使用上面的例子,现在可以编写:

str = str.ReplaceFirst("brown", "quick");


注意:使用Unicode组合字符或连字时,这不能正常工作.例如,`ReplaceFirst("oef","œ","i")`错误地返回"ief"而不是"if".有关详细信息,请参阅[此问题](http://stackoverflow.com/q/20480016/1127114).
有意思的是,您是否测试了关于正则表达式方法在运行时更昂贵的假设?速度怎么样?也许使用Regex的搜索比使用IndexOf更快?
ReSharper警告`String.IndexOf是文化特定的.更强大,更新为`int pos = text.IndexOf(search,StringComparison.Ordinal);`.

2> Wes Haggard..:

正如所说的Regex.Replace是一个很好的选择,但为了使他的答案更完整,我将用代码示例填写:

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

第三个参数(在本例中设置为1)是要从字符串开头在输入字符串中替换的正则表达式模式的出现次数.

我希望这可以通过静态Regex.Replace重载来完成,但不幸的是,你需要一个Regex实例才能完成它.



3> itsmatt..:

看看Regex.Replace.


具体来说,Regex.Replace方法(String,String,Int32)将起到作用,并且非常简洁.

4> Marc Gravell..:

考虑到"仅限第一",或许:

int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
     input.Substring(index + 2);

或者更一般地说:

public static string ReplaceFirstInstance(this string source,
    string find, string replace)
{
    int index = source.IndexOf(find);
    return index < 0 ? source : source.Substring(0, index) + replace +
         source.Substring(index + find.Length);
}

然后:

string output = input.ReplaceFirstInstance("AA", "XQ");



5> 小智..:
using System.Text.RegularExpressions;

RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);

首先发现FInputString,并取代它R.


我通过`result =(New Regex(“ F”)).. Replace(InputString,“ R”,1)将其简化为单线。

6> Bill the Liz..:

在C#语法中:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);



7> mortenbpost..:

C#扩展方法将执行此操作:

public static class StringExt
{
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue)
    {
         int i = s.IndexOf(oldValue);
         return s.Remove(i, oldValue.Length).Insert(i, newValue);    
    } 
}

请享用


如果oldValue不是字符串的一部分,这将失败.
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有