0

私はルビーが初めてで、問題を解決しようとしています。

異なる値を持つヘッダーを削除したいいくつかのテキスト フィールドを解析しています。ヘッダーが常に同じ場合は正常に機能します。

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

しかし、いくつかの引数を入れてもうまくいきません:

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

3 に答える 3

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
于 2012-11-26T16:48:47.430 に答える
2

適切な正規表現を使用してください:

variable.gsub(/^(Header_1|Header_2|Header_3|Header_4|:)$/, '')
于 2012-11-26T16:48:42.470 に答える
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 :: Assemblyモジュールに相当するものがありません。このモジュールは、単語の大きなリストから高度に最適化されたパターンを構築できます。何ができるかの例については、StackOverflowでここを検索してください。例えば:

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))
于 2012-11-26T17:54:08.093 に答える