.NET에서 문자열의 * 첫 번째 인스턴스 *를 어떻게 바꾸나요?


108

주어진 문자열에서 첫 번째 항목을 바꾸고 싶습니다.

.NET에서 어떻게이 작업을 수행 할 수 있습니까?


사람들이 이해할 수있는 명확한 게시물을 작성하십시오. 나는 당신을 위해 이것도 편집했습니다. 최소한 여기에 언어를 지정해야합니다.
GEOCHET

물론 대체 되지 않습니다 . 항상 대체 텍스트가있는 원래 문자열을 포함하는 새 문자열입니다. 이것은 문자열이 불변하기 때문입니다.
Pablo Marambio 2010 년

나는`String.Replace ()`메소드를 시도했다. 그러나 모든 "AA"를 "XQ"로 대체합니다
Thorin Oakenshield

2
이 질문 - stackoverflow.com/questions/141045/...은 - 당신이해야 할 일에 대해 모든 것을 알 수
stack72

1
참고 : 찾기 / 바꾸기 예제로 "AA"=> "XQ"를 사용한 다른 유사한 질문과 병합합니다.
Marc Gravell

답변:


134
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");

2
흥미롭게도 정규식 접근 방식이 런타임에 더 비싸다는 가정을 테스트 했습니까? 속도는 어떻습니까? 아마도 Regex를 사용한 검색이 IndexOf를 사용하는 것보다 빠를까요?
mfloryan 2011 년

나는 Substring ()과 관련된이 접근법보다 Remove () 및 Insert ()와 관련된 @BilltheLizard의 대답을 선호합니다. 하나가 다른 것보다 낫다고 말할 근거가 있습니까?
JohnC 2013-08-20

3
주의 : 유니 코드 조합 문자 또는 합자에서는 제대로 작동하지 않습니다. 예를 들어 ReplaceFirst("oef", "œ", "i")"if"대신 "ief"를 잘못 반환합니다. 자세한 내용은 이 질문 을 참조하십시오.
Michael Liu

2
ReSharper가 경고합니다 String.IndexOf is culture specific.. 업데이트에 더 강력한 int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango

64

마찬가지로 itsmatt는 말했다 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 인스턴스가 필요합니다.


1
그것은 문자 그대로 작동 "foo"하지만, 당신은 new Regex(Regex.Escape("foo"))비유적인 것을 원할 것 입니다 "foo".
러핀


15

"첫 번째"만 고려하면 다음과 같습니다.

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

11
using System.Text.RegularExpressions;

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

먼저 찾을 수 F있는 InputString과로 교체 R.


2
나는 그것을 한 result = (New Regex("F")).Replace(InputString, "R", 1)
줄로

여기 (cjbarth와 함께) 우수 답변
토드 밴스

8

이 작업을 수행 할 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);    
    } 
}

즐겨


감사! 문자열에서 문자의 첫 번째 발생을 제거하는 "RemoveFirst"확장 메서드를 만들기 위해 이것을 수정했습니다.
pbh101

4
oldValue가 문자열의 일부가 아니면 실패합니다.
VVS

8

C # 구문에서 :

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

4

고려할 VB.NET도 있기 때문에 다음을 제공하고 싶습니다.

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String
    Dim pos As Integer = text.IndexOf(search)
    If pos >= 0 Then
        Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length)
    End If
    Return text 
End Function

4

AA문자열의 맨 처음에있는 경우에만 교체하면된다고 가정 합니다.

var newString;
if(myString.StartsWith("AA"))
{
  newString ="XQ" + myString.Substring(2);
}

AA문자열의 시작 여부에 관계없이 첫 번째를 교체해야하는 경우 Marc의 솔루션을 사용하십시오.


3

의 오버로드 중 하나는 Regex.Replace소요 int"교체가 발생할 수있는 최대 번호"를 참조하십시오. 분명히 Regex.Replace일반 텍스트 대체에 사용 하는 것은 과잉처럼 보일 수 있지만 확실히 간결합니다.

string output = (new Regex("AA")).Replace(input, "XQ", 1);

2

에 대한 참조를 신경 쓰지 않는 사람의 경우 Microsoft.VisualBasic는이 Replace방법 :

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"

1

이 예제는 하위 문자열을 추상화하지만 (느리지 만) RegEx보다 훨씬 빠릅니다.

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];

-1
string abc = "AAAAX1";

            if(abc.IndexOf("AA") == 0)
            {
                abc.Remove(0, 2);
                abc = "XQ" + abc;
            }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.