2011-01-25 118 views
3

我幾乎得到了這裏的答案匹配所有,但第一個字母每個字,但我失去了一些東西,我希望這裏有人能幫助我。正則表達式 - 句子

我需要一個正則表達式匹配所有,但在一個句子中每個單詞的第一個字母。然後我需要用正確數量的星號替換匹配的字母。舉例來說,如果我有以下一句:

There is an enormous apple tree in my backyard. 

我需要得到這樣的結果:

T**** i* a* e******* a**** t*** i* m* b*******. 

我已成功地拿出了幾乎不會說的表達式:

(?<=(\b[A-Za-z]))([a-z]+) 

使用上面的例句,該表達式給了我:

T* i* a* e* a* t* i* m* b*. 

如何獲得星號的權數?

謝謝。

+1

你需要使用正則表達式什麼特別的原因?根據您寫入的編程語言,您可以使用替換的子字符串以獲得相同的效果 – jerluc 2011-01-25 05:54:11

回答

7

試試這個:

\B[a-z] 

\B\b相反 - 它匹配那裏是沒有字的邊界 - 當我們看到一個字母是層出不窮信。

你的正則表達式替換的單詞的整條尾巴 - [a-z]+,用一個單一的星號。你應該逐個替換它們。如果你想要的工作,你應該匹配一個字母,但支票背後都有一個字(這是一個有點意義的,因爲你還不如檢查一個字母(?<=[A-Za-z])[a-z]):

(?<=\b[A-Za-z]+)[a-z] 

(注意,最後的正則表達式有一個可變長度的回顧後,這是不是在大多數正則表達式的口味實現)與正則表達式爲/([\w])([\w]*)/紅寶石

0

試試這個可能:

(\w{1})\w*
+0

Oooo忘了星號.. – jerluc 2011-01-25 05:51:53

+0

什麼是「{1}」? (提示:這是一個技巧性的問題。) – 2011-01-25 07:19:51

0

例子:

#!/usr/bin/env ruby 

s = "There is an enormous apple tree in my backyard." 

puts s.scan(/([\w])([\w]*)/).map{ |x| x[0] + '*' * x[1].size + ' ' }.join 
# => T**** i* a* e******* a**** t*** i* m* b******* 

還是一個版本,裏面供奉的.在結束:

puts s.scan(/([\w])([\w]*(|.))/).map{ 
    |x| x[0] + '*' * (x[1].size - 1) + x[2] 
}.join 
# => T**** i* a* e******* a**** t*** i* m* b*******. 
0

這是一個老問題。添加一個答案,因爲其他人似乎沒有完全或清楚地解決這個問題。處理這個問題的最簡單的正則表達式是/(\B[a-z])/g。這將'g'添加爲全局標誌,因此單個字符搜索將在整個字符串中重複。

string = "There is an enormous apple tree in my backyard." 
answer = string.replace(/\B[a-z]/g, "*"); 

string = "There is an enormous apple tree in my backyard." 
 
$("#stringDiv").text(string); 
 

 
answer = string.replace(/\B[a-z]/g, "*"); 
 
$("#answerDiv").text(answer);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="stringDiv"></div> 
 
<div id="answerDiv"></div>