2010-05-22 65 views
4
一个模式相匹配

我有以下字符串:如何从一个字符串中删除了前4个字符,如果它在Ruby中

"h3. My Title Goes Here" 

我基本上是想从字符串中删除前四个字符,这样我只是得到回:

"My Title Goes Here". 

事情是我遍历字符串数组,而不是都有h3.部分在前面,所以我不能只是沟的前四个字符盲目。

我检查了文档,我能找到的最接近的是chomp,但只适用于字符串的末尾。

现在我这样做:

"h3. My Title Goes Here".reverse.chomp(" .3h").reverse 

这让我我想要的输出,但必须有一个更好的办法。我不想两次无理地翻转一个字符串。还有另一种方法可行吗?

+0

+1写得很好的问题。如果可以的话,会给+2。 – 2010-05-22 20:37:52

回答

3

要改变原来的字符串,请使用sub!,例如:

my_strings = [ "h3. My Title Goes Here", "No h3. at the start of this line" ] 
my_strings.each { |s| s.sub!(/^h3\. /, '') } 

为了不改变原始,只返回结果,去掉感叹号,即使用sub。在一般情况下,您可能会有正则表达式,您可以并希望匹配多个实例,在这种情况下,请使用gsub!gsub - 如果没有g,则只会替换第一个匹配项(正如您在此处所需的, ^只能匹配一次字符串的开头)。

+0

关于sub vs gsub的好处。如果我理解正确,sub在这种情况下肯定会更好,因为没有检查整个字符串的重点。我只需要在字符串的一开始就第一次出现。谢谢! – James 2010-05-22 20:42:52

+0

+1好点 - 我忘了Ruby有'sub'和'gsub',并且已经解决了我的问题。 – 2010-05-22 20:43:03

2

的标准方法是使用regular expressions

"h3. My Title Goes Here".gsub /^h3\. /, '' #=> "My Title Goes Here" 

gsub全局装置替代,它通过一个字符串替换的图案,在这种情况下空串。

正则表达式被封闭在/和构成:

^表示字符串
h3逐字匹配的开始,所以这意味着h3
\. - 一个点通常是指任何字符,所以我们转义带有反斜杠
直接匹配

+0

很酷。感谢您的好解释。 – James 2010-05-22 20:35:24

3

您可以使用sub定期表情:

s = 'h3. foo' 
s.sub!(/^h[0-9]+\. /, '') 
puts s 

输出:

foo 

正则表达式应该如下理解:

 
^  Match from the start of the string. 
h  A literal "h". 
[0-9] A digit from 0-9. 
+  One or more of the previous (i.e. one or more digits) 
\. A literal period. 
     A space (yes, spaces are significant by default in regular expressions!) 

您可以修改正则表达式来满足您的需求。请参阅正则表达式教程或语法指南,例如here

+0

很酷。谢谢一堆! – James 2010-05-22 20:35:56

相关问题