投稿

7月, 2014の投稿を表示しています

正規表現における量指定子(greedy,reluctant,possessive)とはなにか

Javaの正規表現では、quantifier(量指定子)の種類としてGreedy、Reluctant、Possessiveというものがある。 webを検索すると説明はいろいろ出てくるが、日本語の付け方が違ったり、3つを並べて比較してなかったりしてわかりづらかったので、これの違いを整理してみる。 まずquantifier(量指定子)とはなにか。 これは"量"指定子という名称の通り、一致させたい文字の数を指定するための表現方法。 例えば、テキストファイルを検索するためによく使われる下記の表現。 .*\.txt これは任意の文字が0個以上続いたあとに、".txt"が続く文字列を表現したものであり、*がquantifier(量指定子)に当たる。 Greedy Quantifier greedy(欲張り)と名前が付いている通り、この量指定子を使うとなるべく多くの繰り返し数になるようにマッチする。 たとえば下記の例がGreedy Quantifier。 .*foo このとき、xfooxxxxxxfooという文字列にマッチさせようとすると、次の文字列がマッチする。 xfooxxxxxxfoo Reluctant Quantifier  reluctant(気乗りしない)と名前がついており、この量指定子を使うとなるべく少なくなる繰り返し数になるようににマッチする。 下記の例がReluctant Quantifier .*?foo このとき、先ほどと同様にxfooxxxxxxfooという文字列にマッチさせようとすると、次の文字列がマッチする xfoo  Possessive Quantifier  possesiveは「所有の」という意味がある。この量指定子を使うとGreedyと同様になるべく多くの繰り返し数になるようにマッチする。Greedyとの違いは、正規表現全体のマッチよりも、Possessive Quantifierを使った部分のマッチが優先される、ということ。 例えば下記の例がpossessive quantifier。 .*+foo 同様にxfooxxxxxxfooにマッチさせようとすると、結果は何にもマッチしない。 ...

MIBとSMIとASN.1

SNMP(Simple Network Management Program)を調べているとよく目にする MIB(Management Information Base) SMI(Structure of Management Information) ASN.1 (Abstract Syntax Notation One) について整理してみました。 MIBとはなにか SNMPで通信を行う際に、やりとりされるデータのこと。 SMIとはなにか MIBがどのような値(整数値、文字列等)を取れるか定義したもの。 SNMPというプロトコルを表現するための記法といえる。 ASN.1とはなにか SMIを定義したもの。SMIはASN1.1の一部、と表現されることもある。 ASN.1自体は古くからプロトコルの定義のために使われており、SNMP以外にも応用の範囲は広い。 まとめると SNMPでは、MIBというデータがやりとりされる。 で、そのMIBを定義するために、古くからあるASN.1というものを用いて、SMIという記法を作った、という感じだろうか。