2012-10-22 25 views
7

Tôi đang phân tích văn bản bằng C# regex. Tôi chỉ muốn thay thế một nhóm cụ thể trong mỗi trận đấu. Đây là cách tôi đang thực hiện:Regex trong C# - làm thế nào tôi thay thế chỉ một nhóm cụ thể trong trận đấu?

void Replace(){ 
    string newText = Regex.Replace(File.ReadAllText(sourceFile), myRegex, Matcher, RegexOptions.Singleline); 
    //....... 
} 

void string Matcher(Match m){ 
    // how do I replace m.Groups[2] with "replacedText"? 
    return ""; // I want to return m.Value with replaced m.Group[2] 
} 

Trả lời

10

này nên làm điều đó:

string Matcher(Match m) 
{ 
    if (m.Groups.Count < 3) 
    { 
     return m.Value; 
    } 

    return string.Join("", m.Groups 
          .OfType<Group>() //for LINQ 
          .Select((g, i) => i == 2 ? "replacedText" : g.Value) 
          .Skip(1) //for Groups[0] 
          .ToArray()); 
} 

Ví dụ: http://rextester.com/DLGVPA38953

EDIT: lookarounds Mặc dù ở trên là câu trả lời cho câu hỏi của bạn như được viết, bạn có thể tìm thấy zero-width đơn giản hơn cho thực tế của bạn trường hợp:

Regex.Replace(input, @"(?<=e)l+(?=o)", replacement) 

Ví dụ: http://rextester.com/SOWWS24307

+0

@AlanDert - Đó có thể là vấn đề với regex của bạn. [Đây là một ví dụ về mã này đang chạy trực tuyến.] (Http://rextester.com/GFFO18933) Bạn có thể thử chỉnh sửa mẫu regex của mình. –

+0

Một vấn đề với giải pháp này là yêu cầu toàn bộ kết hợp được chứa trong các nhóm trong khi nó có ý nghĩa chỉ có các phần cụ thể của một trận đấu trong Nhóm để cho phép truy cập dễ dàng hơn vào các phần có liên quan. –

+0

@MrUniverse - Nếu tôi nhớ đúng, đó là những gì tôi đã nhận được với phụ lục của tôi về cách nhìn không có chiều rộng bằng không. –

4

Bạn có thể sử dụng MatchEvaluator: Hãy thử tính năng này.

var replaced = Regex.Replace(text, pattern, m => m.Groups[1] + "AA" + m.Groups[3]); 

Tôi tìm thấy một bài trong stackoverflow liên quan đến điều này: xem This

+2

Nhưng OP đã có một MatchEvaluator 'khoảng trống chuỗi Matcher (Match m) {} ' –

+1

Trong [rằng câu trả lời khác] (http://stackoverflow.com/a/6005637/20938), giải pháp đúng là cái đầu tiên: thay thế nó bằng chuỗi '" $ 1AA $ 3 "'. Không cần có một MatchEvaluator ở đó, và có lẽ cũng không cần một cái ở đây. –

4

Làm thế nào về điều này?

static string Matcher(Match m) 
    { 
     var group = m.Groups[2]; 
     var startIndex = group.Index - m.Index; 
     var length = group.Length; 
     var original = m.Value; 
     var prior = original.Substring(0, startIndex); 
     var trailing = original.Substring(startIndex + length); 
     return string.Concat(prior, "replacedText", trailing); 
    } 
2

Regex.Replace sẽ luôn luôn thay thế tất cả những gì các regex cung cấp có phù hợp.

Bạn có hai khả năng:

  1. trận đấu chỉ những gì bạn muốn thay thế

    hoặc

  2. Chèn các bộ phận của chuỗi ban đầu đã bị phù hợp, nhưng phải được giữ, vào chuỗi thay thế, sử dụng nhóm chụp.

Bạn đã cung cấp không đủ thông tin để trả lời câu hỏi cụ thể hơn. Ví dụ. bạn có thực sự cần MatchEvaluator không? Điều này chỉ cần thiết, nếu bạn muốn cung cấp một chuỗi thay thế riêng lẻ cho mỗi trận đấu.

0
private string ReplaceText(string originalText) 
    { 
     string replacedText = null; 

     Regex regEx = new Regex("[your expression here]"); 

     Match match = regEx.Match(originalText); 

     if (match.Success) 
     { 
      Group matchGroup = match.Groups[2]; 

      //[first part of original string] + [replaced text] + [last part of original string] 
      replacedText = 
       $"{originalText.Substring(0, matchGroup.Index)}[Your replaced string here]{originalText.Substring(matchGroup.Index + matchGroup.Length)}"; 

     } 
     else 
      replacedText = originalText; 

     return replacedText; 
    } 
+0

hãy làm rõ câu trả lời của bạn –

+0

@AlexFilatov Chắc chắn phần nào? Bạn sẽ gọi nó như vậy ReplaceText ("Hello Quốc gia") thường này sẽ được thông qua tại như một tham số [biểu hiện của bạn ở đây] là những gì bạn đang tìm kiếm là "Quốc gia" [ "chuỗi thay thế của bạn ở đây "] là" Thế giới " những gì bạn sẽ được trả lại cho" Hello World " nếu không có gì được tìm thấy, bạn sẽ lấy lại chuỗi ban đầu của mình. – Raymond

0

Mã bên dưới sẽ khớp và tạo chuỗi thay thế dựa trên bộ sưu tập groupValues. Bộ sưu tập này chỉ định chỉ mục Nhóm và văn bản để thay thế giá trị của nó bằng.

Không giống như các giải pháp khác, nó không yêu cầu toàn bộ kết hợp được chứa trong nhóm, chỉ các phần của trận đấu mà bạn muốn có trong nhóm.

public static string ReplaceGroups(Match match, Dictionary<int, string> groupValues) 
{ 
    StringBuilder result = new StringBuilder(); 

    int currentIndex = 0; 
    int offset = 0; 

    foreach (KeyValuePair<int, string> replaceGroup in groupValues.OrderBy(x => x.Key)) 
    { 
     Group group = match.Groups[replaceGroup.Key]; 

     if (currentIndex < group.Index) 
     { 
      result.Append(match.Value.Substring(currentIndex, group.Index - match.Index - currentIndex)); 
     } 

     result.Append(replaceGroup.Value); 

     offset += replaceGroup.Value.Length - group.Length; 
     currentIndex = group.Index - match.Index + group.Length; 
    } 

    return result.ToString(); 
} 
Các vấn đề liên quan