2011-01-25 157 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>