2016-09-11 134 views
0

我有一個帶有標點符號和匹配括號的表格數據。我需要用空格替換標點符號並用逗號替換大括號。還需要確保最終結果沒有多個空格。c#正則表達式用空格替換標點符號並用逗號替換大括號

例如:

*fName * -sName!lName(London) 

應該

fName sName lName, London 

是想有三個正則表達式,爲了取代它們

static string BracePattern = @"[()]"; 
static string PuncPattern = @"[^\w\,]"; 
static string SpacePattern = @"\s+"; 
res1 = Regex.Replace(formData, BracePattern, ","); 
res2 = Regex.Replace(res1, PuncPattern , ","); 
res3 = Regex.Replace(res2, SpacePattern , ",").trim(); 

我的最終結果是:

fName sName lName,London, 

還是不能得到。我知道有一個正則表達式來解決這個問題。但不能得到它。

回答

1

要更換你的支架模式,你需要添加一個捕獲組開閉括號中的內容,並使用該在返回替換值的函數:

var replacedBrackets = Regex.Replace(res1, 
    @"\((?'content'[^)]+)\)", match => $", {match.Groups["content"].Value}"); 

您還可以將+添加到您的PuncPattern中,用一個空格替換一系列「標點符號」字符 - 這樣可以避免在第三次替換時對空格進行標準化。

請參閱this fiddle進行工作演示。

0

試試這個

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = "*fName * -sName!lName(London) "; 
      string pattern = @"(?'word'\w+)"; 

      MatchCollection matches = Regex.Matches(input, pattern); 

      string output = string.Format("{0} {1} {2}, {3}", 
       matches[0].Groups["word"].Value, 
       matches[1].Groups["word"].Value, 
       matches[2].Groups["word"].Value, 
       matches[3].Groups["word"].Value 
       ); 
      Console.WriteLine(output); 
      Console.ReadLine(); 

     } 
    } 
} 
0

如果你喜歡一個非正則表達式的回答,您可以:

  1. 拆分輸入字符串由多個標點符號
  2. Trim()所有令牌
  3. 刪除空字符串標記
  4. 檢索最後字符串標記
  5. 從列表中刪除最後一個字符串標記
  6. 追加最後一個字符串toke N到的結果與,

代碼:

string line = @"*fName * -sName!lName(London) "; 

var tokens = line.Split(new char[] { '*', '-', '!', '(', ')' }) 
        .Select(s => s.Trim()) 
        .Where(s => !String.IsNullOrWhiteSpace(s.Trim())) 
        .ToList(); 
string last = tokens.Last(); 
tokens.RemoveAt(tokens.Count - 1); 
string result = String.Join(" ", tokens) + ", " + last; 
相關問題