2011-09-14 9 views
1

内で複数の結果をマッチングI次の文字列があります。ルビー正規表現 - ときのマークアップ

nothing to match 
<- 
this rocks should match as should this still and this rocks and still 
-> 
should not match still or rocks 
<- no matches here -> 

を、私は「まだ」「岩」とのすべての一致を検索したいのですが、彼らだけが<内にあるとき - - >

目的は用語集をマークアップしますが、エディタで定義されたテキストの領域にのみマークすることができます。

私は現在持っている:

<-.*?(rocks|still).*?-> 

これは、残念ながら唯一の最初の「岩」にマッチし、それ以降のすべてのインスタンスを無視し、すべての「まだ

だ私はRubular

での使用をこれを持っていますこれのようなものになるでしょう

Regexp.new('<-.*?(' + self.all.map{ |gt| gt.name }.join("|") + ').*?->', Regexp::IGNORECASE, Regexp::MULTILINE) 

どのヘルプのためにも事前にお礼します

答えて

1

これを行うには1つの正規表現を使用する方法がありますが、2つの手順で行うほうが簡単でしょう。最初の試合マークアップのすべて、その後、用語集の単語のためのマークアップを検索:

text = <<END 
nothing to match 
<- 
this rocks should match as should this still and this rocks and still 
-> 
should not match still or rocks 
<- no matches here -> 
END 

text.scan(/<-.*?->/m).each do |match| 
    print match.scan(/rocks|still/), "\n" 
end 

また、あなたはおそらく(<-...<-...->...->)ネストされたマークアップは決して存在しない場合、正規表現は、ここでの唯一の良い解決策であることに注意すべきであるとなし<-または->がマークアップの内側か外側かにかかわらずエスケープされました。

1

Rubyの文字列メソッドを忘れないでください。正規表現を検討する前にまず使用してください

$ ruby -0777 -ne '$_.split("->").each{|x| x.split("<-").each{|y| puts "#{y}" if (y[/rocks.*still/]) } }' file 
0

ルビーでは、正規表現で何をしたいかによって異なります。正規表現を文字列と照合するので、String methodsを使用します。これらのうちいくつかはすべての試合に影響します(例:gsubまたはrpartition)。他のものは最初の試合のみに影響を与えます(例えば、rindex=~)。

(最初の一致のみを返す)後者のいずれかを使用している場合は、特定のオフセットから開始してメソッドを再度呼び出すループを使用する必要があります。たとえば、次のように

# A method to print the indices of all matches 
def print_match_indices(string, regex) 
    i = string.rindex(regex, 0) 
    while !i.nil? do 
    puts i 
    i = string.rindex(regex, i+1) 
    end 
end 

(はい、あなたが最初の分割を使用することができますが、私は上記のような正規表現ループが少ないシステムリソースを必要とすることを期待しています。)