2015-01-14 40 views
1

我試圖在C#中標準化某些作者姓名的格式。棘手的是那些使用首字母縮寫的人。例如流行的哈利波特系列的作者可能是其中的任何一種:如何用相同的字符替換一組單個字符和空白區域,但沒有空白區域

  • JK羅琳
  • J.K.羅琳
  • J·K·羅琳
  • Ĵķ羅琳

我想所有的這些規範爲 「JK羅琳」。

我也試圖解決像JRR托爾金這樣的名字,其中有三個首字母而不是兩個。

經過簡單替換「。」後,我剩下了「J K Rowling」或「J R R Tolkien」。我想將它們轉換成「JK羅琳」和「JRR托爾金」。

所以邏輯是: 捕獲一個單一的字符,後面跟着任意數量的空格,然後跟着但不包括另一個單個字符。從捕獲中刪除空白區域,並用清理後的字符串替換捕獲區域。

下面是一些樣本:

  • 托爾金 - >托爾金
  • EL詹姆斯 - > EL詹姆斯
  • 弗朗西斯·斯科特·菲茨傑拉德 - >無變化

我已經到了這個地步,我能夠捕捉到我需要的字符:

(\b[a-zA-Z]\b\s*)* 

https://www.debuggex.com/r/OLnu3YvvjIumGbQ1

但我不知道該從哪裏去,以便用沒有任何空格的版本替換捕獲。

回答

2

使用此正則表達式,然後用空字符串替換匹配。

@"(?<=\b[A-Z])[.\s]+(?=[A-Z]\b)|(?<=\b[A-Z])\.(?=\s[A-Z])" 

DEMO

Regex.Replace(yourString, @"(?<=\b[A-Z])[.\s]+(?=[A-Z]\b)|(?<=\b[A-Z])\.(?=\s[A-Z])", ""); 
+0

現在它應該.. –

1

你需要使用正則表達式?你可以分開一個名字,然後根據你的想法插入空格(如果你發現一個新模式可能會更容易改變)。像這樣:

string FixName(string name) 
    { 
     StringBuilder sb=new StringBuilder(); 
     var ar=name.Replace('.',' ').Split(' '); 
     for (int i = 0; i < ar.Length; i++) 
     { 
      sb.Append(ar[i]); 
      if (i < ar.Length - 1 && ar[i+1].Length>1) 
       sb.Append(" "); 
     } 
     return sb.ToString(); 
    }