2011-03-18 110 views
0

我有逗號分隔的單詞列表,我想從刪除逗號,並用空格代替:語境正則表達式

elements-(a,b,c,d) 

變爲:

elements-(a b c d) 

的問題是我怎麼能當且僅當該列表位於特定的上下文中時,使用正則表達式來執行此操作,例如只有元素 - ()前綴:

以下:

There are a number of elements-(a,b,c,d) and a number of other elements-(e,f,g,h)

應該變成:

There are a number of elements-(a b c d) and a number of other elements-(e f g h) 

什麼是正則表達式用做這個正確的方法是什麼?

+3

在什麼語言? – 2011-03-18 01:21:52

+0

有人回答你的問題,所以你應該確定他們的答案爲接受。 – Tom 2011-03-18 17:21:52

回答

3

對於上下文正則表達式,您可以使用zero-width look-around assertions。環視斷言用於斷言某些事情必須是真實的,以便匹配成功,但它們不消耗任何字符(因此「零寬度」)。

在你的情況下,你想使用積極的後視和前瞻斷言。在C#中,你可以做到以下幾點:

static string Replace(string text) 
    { 
     return Regex.Replace(
      text, 
      @"(?<=elements\-\((\w+,)*)(\w+),(?=(\w+,)*\w+\))", 
      "$2 " 
     ); 
    } 

有三個基本部分組成的模式在這裏(按順序):

  1. (?<=elements\-\((\w+,)*) - 這是肯定的向後看斷言。它表示,只有在文本elements-(和零個或多個以逗號分隔的字符串之前,模式纔會匹配。
  2. (\w+), - 這是實際的匹配。這是正在被替換的文本。
  3. (?=(\w+,)*\w+\)) - 這是積極的前瞻斷言。它表示,只有跟隨一個或多個以逗號分隔的字符串時,該模式纔會匹配。

在C#中,匹配內部逗號分隔的內容,則可以選擇執行以下操作:

static string Replace(string text) 
    { 
     return Regex.Replace(
      text, 
      @"(?<=elements\-)\(((\w+,)+\w+)\)", 
      m => string.Format("({0})", m.Groups[1].Value.Replace(',', ' ')) 
     ); 
    } 

與正先行斷言的基本方法仍然是相同的。

輸出示例:

"(x,y,z) elements-(a,b) (m,m,m) elements-(c,d,e,f,g,h)"

... ...變得

"(x,y,z) elements-(a b) (m,m,m) elements-(c d e f g h)"

+0

太棒了......謝謝 – Jon 2011-03-18 10:32:35

+0

您能否將答案標記爲已接受? – lkuty 2011-12-23 15:55:18