2010-01-21 265 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