2009-06-18 144 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,您可能使用了錯誤的字符類來匹配字母數字表達式。