我需要一个正则表达式来替换任何单词中间的连字符,但不要触及前导或尾随或单独的连字符。这适用于Regex.Replace()
中的.NET我尝试了以下
\w[-]\w
但这也捕获了连字符两侧的字符。举个例子,我需要的是以下字符串
-test test-test -test
如果替换字符是!,则变为
-test test!test -test
任何帮助都很受欢迎
由于
詹姆斯
答案 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+
你的表达式与连字符之前的字母,连字符和连字符后面的字母相匹配。它会查找所需的所有连字符,即使是带有多个连字符的单词。你想怎么替换连字符?你能更具体地了解你的目标吗?