2010-01-21 160 views
2

我已經得到了以下REG EXP正則表達式替換

(-[^\w+])|([\w+]-[\w+]) 

我想用它用空格來代替破折號

test -test    should not be replaced 
test - test   should be replaced 
test-test    should be replaced 

所以只有當測試 - 測試劃線不應被替換。

當前([\ w +] - [\ w +])正在取代周圍的短劃線。

 var specialCharsExcept = new Regex(@"([\w+]-[\w+])", RegexOptions.IgnoreCase); 

     if (string.IsNullOrEmpty(term)) 
      return ""; 

     return specialCharsExcept.Replace(term, " "); 

任何幫助?在此先感謝

PS:我正在使用C#。

更新

我想現在使用下列情況下,你REG進出口。

some - test "some test" - everything within the quotes the expression should not be applied 

這可能嗎?

+0

應該帶些什麼來替代? – 2010-01-21 11:16:28

+0

你確定它是'[\ w +]'而不是'\ w +'嗎?前者匹配所有字母數字(和'_')以及加號。 – kennytm 2010-01-21 11:17:32

+0

破折號應該用空格代替 – Chris 2010-01-21 11:20:38

回答

5

試試這個瘋狂的一個:

-(?!\w(?<=\s-\w)) 

此正則表達式:

  • 搜索正在後面沒有(信與前兩個字符是一個空格)破折號。
  • 處理test- test-test,這是您的測試用例中沒有的。
  • 只選擇破折號,因此您可以將其替換(這實際上是使定義如此複雜的原因)。

順便說一句 - 你不需要RegexOptions.IgnoreCase因爲你的正則表達式在字面上沒有任何部件,你是不是tryting到captrue /test/"Test TEST".這將做到:

Regex specialCharsExcept = new Regex(@"-(?!\w(?<=\s-\w))"); 
return specialCharsExcept.Replace(term, " "); 
+0

+1表示正確;-) – Erik 2010-01-21 11:37:10

+0

正則表達式可能非常困難:-O – Khelben 2010-01-21 12:56:39

+0

您可以告訴我如何擴展此表達式以在「test -test」用引號括起來時禁用此規則?比如:some -test「some -test」,引號內的內容不應該被替換 – Chris 2010-01-21 13:32:59

1

好的,根據評論改變。

>>> r = ' +(-) +|(?<=\w)-(?=\w)' 
>>> re.sub(r, ' ', 'test - test') 
'test test' 
>>> re.sub(r, ' ', 'test-test') 
'test test' 
>>> re.sub(r, ' ', 'test -test') 
'test -test' 

編輯根據評論更正。訣竅是在?=?<=之間加上'lookahead assertion'和lookbehead assertion,它們不屬於比賽的一部分,但會被檢查。

+0

不完全,我只想替換破折號,而不是整個輸入 第二個示例也應該返回替換。如果test -test在線,破折號可能會保留。 – Chris 2010-01-21 11:29:31

+0

我編輯了它。它還剝去第二個箱子上的空白空間。 – Khelben 2010-01-21 11:58:51

+0

根據測試用例,'test-test'上的破折號也應該被替換。 '(?= \ w)-'是一個向前看,所以它正在尋找一個字母短劃痕 - 應該看起來在後面。另外,考慮在示例代碼中使用'r',它將變得更具可讀性。 – Kobi 2010-01-21 12:01:42