Ruby gsub / regex有几个参数

我是ruby的新手,我正在努力解决问题。

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

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

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

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

你可以使用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 

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

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

如果标头始终与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))