正则表达式替换一个单词中间的连字符

时间:2009-06-18 09:25:11

标签: .net regex

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

中的.NET

我尝试了以下

\w[-]\w

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

-test test-test -test

如果替换字符是!,则变为

-test test!test -test

任何帮助都很受欢迎

由于

詹姆斯

4 个答案:

答案 0 :(得分:6)

如果我正确理解了这个问题,那就是匹配连字符,而不是旁边的字。这是一个类似perl的正则表达式:

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

这是一个积极的外观断言,一个连字符和一个积极的先行断言。

答案 1 :(得分: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修饰符,使其替换了所有' - '实例。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这个正则表达式匹配所有单词中包含1个连字符的单词:

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

这相当于:

\w+[-]\w+

你的表达式与连字符之前的字母,连字符和连字符后面的字母相匹配。它会查找所需的所有连字符,即使是带有多个连字符的单词。你想怎么替换连字符?你能更具体地了解你的目标吗?