如果它与Ruby中的模式匹配,如何从字符串中删除前4个字符

时间:2010-05-22 20:25:54

标签: ruby regex string

我有以下字符串:

"h3. My Title Goes Here" 

我基本上想从字符串中删除前四个字符,以便我回来:

"My Title Goes Here".  

问题是我正在迭代一个字符串数组而不是所有字符串前面都有h3.部分所以我不能盲目地抛弃前四个字符。

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

现在我正在这样做:

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

这给了我想要的输出,但必须有更好的方法。我不想无缘无故地反转一个字符串两次。还有其他方法可行吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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只有第一个匹配是替换(如你所愿,在任何情况下,^只能匹配一次到字符串的开头。)

答案 2 :(得分:2)

标准方法是使用regular expressions

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

gsub表示全局替换,它用字符串替换模式,在本例中为空字符串。

正则表达式包含在/中,构成:

^表示字符串
的开头 h3字面匹配,因此意味着h3
\. - 一个点通常表示任何字符,所以我们用反斜杠来逃避它 字面匹配