Skip to main content

14 posts tagged with "String"

View All Tags

3種類の括弧の対応をチェックするC言語プログラム

· 4 min read
Yu Sasaki
Enterprise Security Manager / Advisor

先日勉強会でこの辺のテーマを取り上げたので、字句解析や構文解析(の一部)とスタックの復習も兼ねて作成(required for 1h+)。

実装のポイント

  • 閉じ括弧の有無の判定は、ファイルの終端が読み終わった後。
  • 開き括弧の判定は、閉じ括弧を読み込んだ際に行い、スタックの最上位に対応する開き括弧があるか否かで。
  • 入れ子の(または再帰的な)構造で、どの深さにスレッドがいるか調べるにはスタックを用いる。

Webページから指定したタグの要素を抜き出すRuby関数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

単一のWebページから抜き出した複数の要素を配列に格納して返します。 以下の例はaタグの要素(エレメント)を抽出した場合です。

Rubyコード

require 'net/http'
require 'kconv'
def parse_array(string, beg_tag, close_tag)
array = Array.new
string.scan(/#{beg_tag}(.*?)#{close_tag}/sm) { |matched|
#puts matched
array = array | matched
}
return array
end
Net::HTTP.version_1_2
Net::HTTP.start('b.hatena.ne.jp', 80) {|http|
response = http.get('/hotentry/')
str = Kconv.tosjis(response.body)
a_tag_array = parse_array(str, "" )
puts a_tag_array
}

学んだこと

  • Net::HTTP.startメソッドをブロックを用いて呼び出すことによって、ブロックの間だけセッションを開いて接続し、ブロック終了とともに自動的にセッションを閉じる。Rubyに慣れてもJavaやCでの手続きを意識しておくこと。
  • 配列の結合には和集合(演算子は「|」)を用いた。この場合、重複する要素は1つとして数えられる。別々に数えたい場合は「+」演算子を用いる。
  • String#scanメソッドはブロックで用いるとブロック変数にマッチした部分を格納する。その際、正規表現の中で「()」が用いられると、()内の部分を配列にして返す。今回は別に配列にする必要はなかったかも。

参考サイト

Web サーバからドキュメントを得る - Rubyist Magazine - 標準添付ライブラリ紹介 【第 7 回】 net/http

Rubyで引数の設定値によって4パターンの部分文字列を取得するラッパー関数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

引数に設定値を与え、それによって挙動を変えることで、似た機能をまとめてみます。

追記(2008.2.8):正規表現のマッチを保持する変数があったことを失念していました。「$`」マッチした部分より前の文字列、「$&」マッチした文字列、「$'」マッチした部分より後ろの文字列を使えばより簡潔に書けると思いました。

ソースコード

EXCL = true
INCL = false
BEFORE = true
AFTER = false
#
# string 分割する文字列
# delineator 分割する場所
# desired BEFORE: delineator 文字列より前の文字列
# AFTER: delineator 文字列より後の文字列
# type INCL: 分割文字列に delineator を加える
# EXCL: 分割文字列に delineator を加えない
def split_str(string, delineator, desired, type)
low_str = string.downcase # 小文字に揃える(変換)
marker = delineator.downcase
return if (low_str.index(marker) == nil) # delineator に一致しない
if (desired == BEFORE)
if (type == EXCL)
split_pos = low_str.index(marker)
else
split_pos = low_str.index(marker) + marker.length
end
parsed_str = low_str[0, split_pos]
else
if (type == EXCL)
split_pos = low_str.index(marker)+marker.length
else
split_pos = low_str.index(marker)
end
parsed_str = low_str[split_pos, string.length]
end
return parsed_str
end
string = "I'm designing a Web crawler and a Search engine."
p split_str(string, "crawler", BEFORE, INCL);
p split_str(string, "crawler", BEFORE, EXCL);
p split_str(string, "crawler", AFTER, INCL);
p split_str(string, "crawler", AFTER, EXCL);
p split_str(string, "crauler", AFTER, EXCL);

実行結果

"i'm designing a web crawler"
"i'm designing a web "
"crawler and a search engine."
" and a search engine."
nil

単に部分文字列を取得するには

str = "A Web crawler"
p str[6, str.size] #=> "crawler"