我是ruby的新手,我正试图解决问题。
我正在解析几个文本字段,我想删除具有不同值的标题。当标题始终相同时,它可以正常工作:
variable = variable.gsub(/(^Header_1:$)/, '')
但是当我提出几个论点时它不起作用:
variable = variable.gsub(/(^Header_1$)/ || /(^Header_2$)/ || /(^Header_3$)/ || /(^Header_4$)/ || /^:$/, '')
答案 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))