2012-11-26 31 views
0

我是新來紅寶石,我試圖解決一個問題。紅寶石gsub /正則表達式與幾個參數

我解析通過幾個文本字段,我想要刪除具有不同值的標題。它工作正常時,頭始終是相同的:

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

但是,當我把幾個參數它不工作:

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

回答

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 
+0

啊!好戲! –

+0

謝謝你,完美的工作! –

2

只要使用正確的正則表達式:

variable.gsub(/^(Header_1|Header_2|Header_3|Header_4|:)$/, '') 
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的正則表達式::組裝MODU le,它可以從大單詞列表中構建高度優化的模式。在這裏搜索堆棧溢出瞭解它可以做什麼的例子。例如:

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))