2009-06-18 79 views
2

我需要一个正则表达式来替换任何单词中间的连字符,但不要触及前导或尾随单词或独立单词。这是内Regex.Replace在.NET中使用()正则表达式替换字符中间的连字符

我已经试过以下

\w[-]\w 

但也抓住了连字符的字符两侧。举个例子,我需要的是以下字符串

- 测试测试测试 - 测试

如果替换字符是!,成为

- 测试测试!测试 - 测试

任何帮助很大收到

感谢

詹姆斯

+1

请您进一步详细说明“似乎不正确匹配”?举几个例子。 – Moshe 2009-06-18 09:32:00

+0

你也应该说你正在使用什么技术/框架。并非所有的正则表达式引擎都是相同的。 – AakashM 2009-06-18 10:42:53

+0

对不起,我不是很清楚。编辑了这个问题更有意义 – James 2009-06-18 11:06:57

回答

6

如果我理解正确的问题,它是关于匹配连字符,而不是旁边的文字。下面是一个Perl的正则表达式一样:

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

这是一个积极的向后断言,一个连字符和一个积极的预测先行断言。

1

用Perl(你没有提到语言)工作的:

/\w-\w/ 

例如,尝试这一个班轮:

mine:~> perl -e '$x="abc-def"; $x=~/\w(-)\w/; print "$x $1\n";' 
abc-def - 

或者这一个:

mine:~> perl -e '$x="abc-def"; print "$x\n";$x=~s/(\w)-(\w)/$1 $2/; print "$x\n";' 
abc-def 
abc def 

下面是一个例子(来自评论)替换所有的相关' - '在字符串中:

mine:~> perl -e '$x="-this i-s a te-st-"; print "$x\n";$x=~s/(\w)-(\w)/$1$2/g; print "$x\n";' 
-this i-s a te-st- 
-this is a test- 

请注意,在这个例子中,我只是删除了破折号,而在前面的例子中,我用空格替换了它。我还将g修饰符添加到替换命令以使其替换“ - ”的所有实例。

0

这个表达式用准确1连字符的所有单词匹配它:

[a-zA-Z]+[-][a-zA-Z]+ 

这相当于:

\w+[-]\w+ 

你表达的连字符前面的字母,连字符和后面的字母相匹配连字符。它会查找所需的所有连字符,即使是带有多个连字符的文字。你想如何替换连字符?你能对你的目标更具体吗?

1
echo "- foo-bar - bar-foo -" | sed -e 's/\([[:alnum:]]\)-\([[:alnum:]]\)/\1\2/g' 

如果您使用sed,您可能使用了错误的字符类来匹配字母数字表达式。