带有几个参数的Ruby gsub / regex

时间:2012-11-26 16:41:19

标签: ruby regex

我是ruby的新手,我正试图解决问题。

我正在解析几个文本字段,我想删除具有不同值的标题。当标题始终相同时,它可以正常工作:

variable = variable.gsub(/(^Header_1:$)/, '')

但是当我提出几个论点时它不起作用:

variable = variable.gsub(/(^Header_1$)/ || /(^Header_2$)/ || /(^Header_3$)/ || /(^Header_4$)/ || /^:$/, '')

3 个答案:

答案 0 :(得分:3)

您可以使用Regexp.union

regex = Regexp.union(
  /^Header_1/,
  /^Header_2/,
  /^Header_3/,
  /^Header_4/,
  /^:$/
)
variable.gsub(regex, '')

请注意,^something$不适用于包含something以上内容的字符串:)

原因^用于匹配字符串的开头,$用于字符串的结尾。

所以我故意删除$

当您只需要删除匹配的字符串时,也不需要括号。

你也可以这样使用它:

headers = %w[Header_1 Header_2 Header_3]
regex = Regexp.union(*headers.map{|s| /^#{s}/}, /^\:$/, /etc/)
variable.gsub(regex, '')

当然,您可以在不明确定义标题的情况下删除标题。

标题后很可能有空格?

如果是这样,你可以这样做:

variable = "Header_1 something else"
puts variable.gsub(/(^Header[^\s]*)?(.*)/, '\2')
#=>  something else

variable = "Header_BLAH something else"
puts variable.gsub(/(^Header[^\s]*)?(.*)/, '\2')
#=>  something else

答案 1 :(得分:2)

只需使用正确的正则表达式:

variable.gsub(/^(Header_1|Header_2|Header_3|Header_4|:)$/, '')

答案 2 :(得分:0)

如果标题始终与Header_n的格式相同,其中n是某个整数值,那么您可以大大简化正则表达式:

/Header_\d+/

会找到其中的每一个:

%w[Header_1 Header_2 Header_3].grep(/Header_\d+/)

[
    [0] "Header_1",
    [1] "Header_2",
    [2] "Header_3"
]

调整它以处理查找单词,而不是子串:

/^Header_\d+$/

或:

/\bHeader_\d+\b/

如上所述,使用Regexp.union是一个良好的开端,但是,盲目使用,可能会导致模式非常慢或效率低下,因此请提前考虑并通过提供有用的子模式来帮助引擎:

values = %w[foo bar]
/Header_(?:\d+|#{ values.join('|') })/
=> /Header_(?:\d+|foo|bar)/

不幸的是,Ruby没有相当于Perl的Regexp :: Assemble模块,它可以从大的单词列表中构建高度优化的模式。在Stack Overflow上搜索它可以做什么的例子。例如:

use Regexp::Assemble;

my @values = ('Header_1', 'Header_2', 'foo', 'bar', 'Header_3');
my $ra = Regexp::Assemble->new;
foreach (@values) {
    $ra->add($_);
}
print $ra->re, "\n";
=> (?-xism:(?:Header_[123]|bar|foo))