0

次のような文字列があります。

src="http://www.google.com/calendar/embed?showTitle=0&mode=WEEK&height=600&wkst=1&bgcolor=%23FFFFFF&src= 59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com &color=%23B1365F&src=cnuvtn9nofljk5kq9381ic5odcalendgar%4.0 google.com&color=%232952A3&ctz=アメリカ%2FNew_York" style="border-width:0" width="800" height="600" frameborder="0" scrolling="no"

太字のセクションを抽出したいと思います。常に asrc=と の間にあり&ます。現在、私はやっています

"sample string above".match(/;src.*?&/)[0][5, length-5]

しかし、それは本当にエレガントではないようです。これを行うより良い方法はありますか?

4

4 に答える 4

2
"sample string above"[/&src=(.*?)&/, 1]

1 は最初のキャプチャ グループを意味します

于 2013-01-21T05:07:34.037 に答える
1

何が起こったのかを理解するだけで、正規表現はまったく必要ありません。問題は、 のコンテンツがsrcHTML エンティティ用にエンコードされており、その結果、&の変数間に埋め込まれてエンコードされていること&です。

修正は、最初に文字列をデコードしてエンコーディングを逆にし、次に文字列をそのコンポーネントに分割することです。次を使用してそれを行うことができます。

require 'cgi'
require 'uri'

uri = URI.parse(src)
hash = Hash[URI::decode_www_form(CGI::unescapeHTML(uri.query))]
hash['src'] # => "cnuvtn9nofljk5kq9381ic5odg@group.calendar.google.com"

クエリをハッシュにデコードする別の方法は次のとおりです。

hash = Hash[CGI::unescapeHTML(uri.query).split('&').map{ |q| q.split('=') }]

で分割すると、配列の配列が得られ&、それ=を簡単にハッシュに変換して戻すことができるため、文字列内の任意の変数に簡単にアクセスできます。

これらは長いパスのように見えますが、問題を修正し、値を元の形式に戻します。

通常はそれをハッシュとして使用したいのですが、この場合"src"、クエリに 2 つのパラメーターがあり、2 番目のパラメーターが最初のパラメーターを踏みにじる原因となるため、すべてを行うことはできません。2 番目ではなく 1 番目が必要な場合は、ハッシュに変換せずに取得する必要があります。

URI::decode_www_form(CGI::unescapeHTML(uri.query)).select{ |k,v| k == 'src' }
=> [["src", "*59flluvbaj110hp6ht5hrveof8@group.calendar.google.com*"], ["src", "cnuvtn9nofljk5kq9381ic5odg@group.calendar.google.com"]]

URI::decode_www_form(CGI::unescapeHTML(uri.query)).select{ |k,v| k == 'src' }[0]
=> ["src", "*59flluvbaj110hp6ht5hrveof8@group.calendar.google.com*"]

URI::decode_www_form(CGI::unescapeHTML(uri.query)).select{ |k,v| k == 'src' }[1]
=> ["src", "cnuvtn9nofljk5kq9381ic5odg@group.calendar.google.com"]

表示される文字列は正しくありませんが、代わりに、HTML から切り取って貼り付けたもののように見えます。その場合、正規表現ではなく、パーサーを使用してコンテンツを抽出する必要があります。そして、その場合、これを正しく行う方法は次のとおりです。

require 'nokogiri'

html = '<img src="http://www.google.com/calendar/embed?showTitle=0&mode=WEEK&height=600&wkst=1&bgcolor=%23FFFFFF&src=59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com&color=%23B1365F&src=cnuvtn9nofljk5kq9381ic5odg%40group.calendar.google.com&color=%232952A3&ctz=America%2FNew_York" style=" border-width:0 " width="800" height="600" frameborder="0" scrolling="no">'

doc = Nokogiri.HTML(html)
src = doc.at('img')['src']
=> "http://www.google.com/calendar/embed?showTitle=0&mode=WEEK&height=600&wkst=1&bgcolor=%23FFFFFF&src=59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com&color=%23B1365F&src=cnuvtn9nofljk5kq9381ic5odg%40group.calendar.google.com&color=%232952A3&ctz=America%2FNew_York"

ドキュメント内のタグの場所によってノコギリのat方法 doc.at('img')が変わるかもしれませんが<img>、それをどう扱うかは別問題です。

于 2013-01-21T06:40:43.870 に答える
0

引用符の区切り記号を修正する

最初に投稿された文字列には、引用の問題があります。文字列を適切にエスケープしていることを確認してください。たとえば、次の代替構文を使用できます。

src = %q{http://www.google.com/calendar/embed?showTitle=0&mode=WEEK&height=600&wkst=1&bgcolor=%23FFFFFF&src=59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com&color=%23B1365F&src=cnuvtn9nofljk5kq9381ic5odg%4 .google.com&color=%232952A3&ctz=アメリカ%2FNew_York" style="border-width:0" width="800" height="600" frameborder="0" scrolling="no"}

ポジティブ後読みの使用

肯定的な後読みアサーションを使用して文字列をスキャンし、すべての一致を探してから、適切な Array メソッドを使用して関心のあるものにアクセスできます。次に例を示します。

src.scan(/(?<=src=)[^&]+/).first
# => "59flluvbaj110hp6ht5hrveof8%40group.calendar.google.com"
于 2013-01-21T07:18:43.143 に答える
0

次のように、キャプチャ グループを使用してこれを行うことができます。

"sample string above".sub(/^.*src=(.*?)&.*$/, '\1')
于 2013-01-21T06:39:47.070 に答える