Hatena::Grouprubyist

Rubyをラクガク(正規表現編) RSSフィード

2009-12-16

[] 最短一致: *?  最短一致: *? - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  最短一致: *? - Rubyをラクガク(正規表現編)  最短一致: *? - Rubyをラクガク(正規表現編) のブックマークコメント

*?

量指定子(quantifiers)。直前の表現の 0 回以上の繰り返し (最短一致)

プログラミング言語 Ruby リファレンスマニュアル
irb(main):015:0> puts "/'(.*)'/ =~ 'hoge''foo''bar': #{/'(.*)'/ =~ "'hoge''foo''bar'"}" /'(.*)'/ =~ 'hoge''foo''bar': 0
=> nil
irb(main):016:0> $1
=> "hoge''foo''bar"
irb(main):017:0> puts "/'(.*?)'/ =~ 'hoge''foo''bar': #{/'(.*?)'/ =~ "'hoge''foo''bar'"}" /'(.*?)'/ =~ 'hoge''foo''bar': 0
=> nil
irb(main):018:0> $1
=> "hoge"

正規表現初心者は、最短一致の方が直感的に理解しやすいと思う。

KaressKaress2016/05/07 16:04yo sh1ldunRo7;t encrypt your back ups before they leave your facilities. S3 can encrypt using AES at the file system level, but it is ultimately to the consumer to determine what level of security is necessary for their backups. The technology is there, it’s up to us to find ways to use it effectively.

JacieJacie2016/05/09 10:37Scrivi il tuo commento Puoi usare questi tags HTML : <a> <abbr> <acronym> <b> <a href="http://bhkfwp.com">&l;okltcbquote></a> <cite> <code> <del> <em> <i> <q> <strike> <strong> var RecaptchaOptions = { theme : 'red', lang : 'en' , tabindex : 5 };   #submit {display:none;}

Johnb487Johnb4872016/05/30 17:02I like this post, enjoyed this one regards for putting up. The goal of revival is conformity to the image of Christ, not imitation of animals. by Richard F. Lovelace. aecbcfdaeadd

Pharmf250Pharmf2502016/05/31 07:16Very nice site! <a href="http://opeyixa2.com/qovao/1.html">cheap goods</a>

Pharmg873Pharmg8732016/05/31 07:17Very nice site! [url=http://opeyixa2.com/qovao/2.html]cheap goods[/url]

Pharmd301Pharmd3012016/05/31 07:18Very nice site! cheap goods http://opeyixa2.com/qovao/4.html

Pharmd602Pharmd6022016/05/31 07:18Very nice site!

Pharme937Pharme9372016/06/01 13:29Very nice site! <a href="http://ypxoiea2.com/qyatxq/1.html">cheap goods</a>

Pharmf964Pharmf9642016/06/01 13:30Very nice site! [url=http://ypxoiea2.com/qyatxq/2.html]cheap goods[/url]

Pharme378Pharme3782016/06/01 13:31Very nice site! cheap goods http://ypxoiea2.com/qyatxq/4.html

Pharmf858Pharmf8582016/06/01 13:31Very nice site!

Pharmk709Pharmk7092016/06/02 19:30Very nice site! <a href="http://apxoiey2.com/aovax/1.html">cheap goods</a>

Pharmd501Pharmd5012016/06/02 19:31Very nice site! [url=http://apxoiey2.com/aovax/2.html]cheap goods[/url]

Pharmg879Pharmg8792016/06/02 19:32Very nice site! cheap goods http://apxoiey2.com/aovax/4.html

Pharmk873Pharmk8732016/06/02 19:33Very nice site!

Pharmg668Pharmg6682016/06/04 01:32Very nice site! [url=http://apeoixy2.com/tqsvv/2.html]cheap goods[/url]

Pharmc634Pharmc6342016/06/04 01:33Very nice site! cheap goods http://apeoixy2.com/tqsvv/4.html

Pharmf696Pharmf6962016/06/04 01:34Very nice site!

Pharmk414Pharmk4142016/06/05 07:40Very nice site! [url=http://aixypeo2.com/ayatxa/2.html]cheap goods[/url]

Pharmf127Pharmf1272016/06/05 07:41Very nice site! cheap goods http://aixypeo2.com/ayatxa/4.html

Pharmd107Pharmd1072016/06/05 07:42Very nice site!

Pharmd759Pharmd7592016/06/06 13:38Very nice site! <a href="http://yieapxo2.com/qoqsv/1.html">cheap goods</a>

Pharma952Pharma9522016/06/06 13:39Very nice site! [url=http://yieapxo2.com/qoqsv/2.html]cheap goods[/url]

Pharmg913Pharmg9132016/06/06 13:40Very nice site! cheap goods http://yieapxo2.com/qoqsv/4.html

Pharmd32Pharmd322016/06/06 13:40Very nice site!

Pharmf637Pharmf6372016/06/07 19:56Very nice site! <a href="http://oieapxy2.com/tyatxt/1.html">cheap goods</a>

Pharmg335Pharmg3352016/06/07 19:57Very nice site! [url=http://oieapxy2.com/tyatxt/2.html]cheap goods[/url]

Pharmd873Pharmd8732016/06/07 20:00Very nice site! cheap goods http://oieapxy2.com/tyatxt/4.html

Pharme323Pharme3232016/06/07 20:01Very nice site!

2009-12-14

[]アトミック、強欲 アトミック、強欲 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク - アトミック、強欲 - Rubyをラクガク(正規表現編) アトミック、強欲 - Rubyをラクガク(正規表現編) のブックマークコメント

(?> )

バックトラックを抑止する。

この表現はまだ試験実装中です。将来なくなる可能性もありますので、そのつもりで使ってください。特に汎用ライブラリなどで使ってはいけません。

プログラミング言語 Ruby リファレンスマニュアル

アトミック、強欲等、様々な呼び方があるが、要はバックトラックを抑止されてしまう。

> hoge = "hoge 'foo' 'foo' bar"
> hoge =~ /(?>'.*')\s'foo' bar/ #アトミック。「(?>'.*')が、「'foo' 'foo'」にマッチし、それ以降は「'foo' bar」にマッチできなくなってしまう。
=> nil
> hoge =~ /'.*'\s'foo' bar/ #欲張り。初回は「'foo' 'foo'」にマッチするが、それ以降の「'foo'」に対応できる文字列は見つからないので、バックトラック。
=> 5

2009-11-28

[]先読み 先読み - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク - 先読み - Rubyをラクガク(正規表現編) 先読み - Rubyをラクガク(正規表現編) のブックマークコメント

(?= )

先読み(lookahead)。パターンによる位置指定(幅を持たない)

プログラミング言語 Ruby リファレンスマニュアル

先読み、戻り読みは位置に対してマッチする。

puts "/(?=Jeffrey)Jeff/ =~ 'by Jeffrey fried1': #{/(?=Jeffrey)Jeff/ =~ 'by Jeffrey fried1'}"
puts "/(?=Jeffrey)Jeff/ =~ 'by Tomas Jefferson': #{/(?=Jeffrey)Jeff/ =~ 'Tomas Jefferson'}"
/(?=Jeffrey)Jeff/ =~ 'by Jeffrey fried1': 3
/(?=Jeffrey)Jeff/ =~ 'by Tomas Jefferson': 

[]戻り読み 戻り読み - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク - 戻り読み - Rubyをラクガク(正規表現編) 戻り読み - Rubyをラクガク(正規表現編) のブックマークコメント

(戻り読み(lookbehind)は Oniguruma *7が必要)

プログラミング言語 Ruby リファレンスマニュアル

ということで、1.9だと動作します。

ret = "its Jeffs pen.".gsub(/(?<=\sJeff)(?=s\s)/, "'")
puts "'its Jeffs pen.'.gsub(/(?<=\sJeff)(?=s\s)/, \"'\"): #{ret}"
ret = "its Jeffs pen.".gsub(/(?<!\sJeff)(?!s\s)/, "'")
puts "'its Jeffs pen.'.gsub(/(?<!\\sJeff)(?!s\\s)/, \"'\"): #{ret}"
'its Jeffs pen.'.gsub(/(?<=\sJeff)(?=s\s)/, "'"): its Jeff's pen.
'its Jeffs pen.'.gsub(/(?<!\sJeff)(?!s\s)/, "'"): 'i'ts' 'J'e'f'fs' 'p'e'n'.'

本当は「\s」ではなく「\b」で動かしたかったんだけど、うまく動作させることができなかった。

MariMari2012/10/16 14:14Your webtise has to be the electronic Swiss army knife for this topic.

zegpcgzegpcg2012/10/19 14:45vzpnKp , [url=http://bvtoqaktujib.com/]bvtoqaktujib[/url], [link=http://ojbffkgmypii.com/]ojbffkgmypii[/link], http://cdcizhjfhgru.com/

myglpumyglpu2012/10/20 02:19SFUjbl <a href="http://fokpffayndgd.com/">fokpffayndgd</a>

xmplpkxxmplpkx2012/10/20 22:47LZfkGd , [url=http://lujqpnzwertg.com/]lujqpnzwertg[/url], [link=http://pwylwkzppsbt.com/]pwylwkzppsbt[/link], http://csouquyefvky.com/

2009-11-23

[] キャプチャなしの括弧: (?:…)  キャプチャなしの括弧: (?:…) - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  キャプチャなしの括弧: (?:…) - Rubyをラクガク(正規表現編)  キャプチャなしの括弧: (?:…) - Rubyをラクガク(正規表現編) のブックマークコメント

(?: )

後方参照を伴わないグループ化。つまり、\1, \2 (あるいは、 $1, $2)などの対象にはならず、 単純なグループ化の用途で使用します。

プログラミング言語 Ruby リファレンスマニュアル

後方参照できない場合はnilが返る。

puts "/^([-+]?[0-9]+(\.[0-9]*)?)([CF])$/ =~ '12.34F': #{/^([-+]?[0-9]+(\.[0-9]*)\
?)([CF])$/ =~ '12.34F'}: #{$1}#{$2}#{$3}"

puts "/^([-+]?[0-9]+(?:\.[0-9]*)?)([CF])$/ =~ '12.34F': #{/^([-+]?[0-9]+(?:\.[0-\
9]*)?)([CF])$/ =~ '12.34F'}: #{$1}#{$2}#{$3}"
/^([-+]?[0-9]+(.[0-9]*)?)([CF])$/ =~ '12.34F': 0: 12.34.34F
/^([-+]?[0-9]+(?:.[0-9]*)?)([CF])$/ =~ '12.34F': 0: 12.34F

(?:…)を使わない方は$3まで、(?:…)を使う方は$2まで表示

2009-11-22

[] 背景  背景 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  背景 - Rubyをラクガク(正規表現編)  背景 - Rubyをラクガク(正規表現編) のブックマークコメント

正規表現の本を読んだものの、どうアウトプットするか困り果て、ここでRubyで淡々とおさらいをしていこうかと思い立った次第です。

詳説 正規表現 第3版

詳説 正規表現 第3版

[] 選択  選択 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  選択 - Rubyをラクガク(正規表現編)  選択 - Rubyをラクガク(正規表現編) のブックマークコメント

|

選択(alternative)。優先順位が低いので下の「グループ化」とあわせて使うことが多い。

プログラミング言語 Ruby リファレンスマニュアル
puts "/hoge|foo|bar/ =~ 'hoge': #{/hoge|foo|bar/ =~ 'hoge'}"
puts "/hoge|foo|bar/ =~ 'a foo': #{/hoge|foo|bar/ =~ 'a foo'}"
puts "/hoge|foo|bar/ =~ 'not found.': #{/hoge|foo|bar/ =~ 'not found.'}"
/hoge|foo|bar/ =~ 'hoge': 0
/hoge|foo|bar/ =~ 'a foo': 2
/hoge|foo|bar/ =~ 'not found.':

true/falseではなく、どこにマッチしたか位置が返ってくるのか。あまり戻り値をどう使うか気にしたことなかった。

[] 単語境界  単語境界 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  単語境界 - Rubyをラクガク(正規表現編)  単語境界 - Rubyをラクガク(正規表現編) のブックマークコメント

\b

文字クラス指定の外では語境界 (\w と \W のあいだにマッチ)。文字クラス指定内ではバックスペース (0x08)。

プログラミング言語 Ruby リファレンスマニュアル
puts "/\bhoge\b/ =~ 'foo bar hoge': #{/\bhoge\b/ =~ 'foo bar hoge'}"
puts "/\bhoge\b/ =~ 'foo hoge bar': #{/\bhoge\b/ =~ 'foo hoge bar'}"
puts "/\bhoge\b/ =~ 'hoge foo bar': #{/\bhoge\b/ =~ 'hoge foo bar'}"
puts "/\bほげ\b/ =~ 'ふー、ほげ、ばー': #{/\bほげ\b/ =~ 'ふー、ほげ、ばー'}"
puts "/\bほげ\b/ =~ 'ふー ほげ ばー': #{/\bほげ\b/ =~ 'ふー ほげ ばー'}"
hog/ =~ 'foo bar hoge': 8
hog/ =~ 'foo hoge bar': 4
hog/ =~ 'hoge foo bar': 0
ほ/ =~ 'ふー、ほげ、ばー':
ほ/ =~ 'ふー ほげ ばー':

一応日本語を試してみたけど、やっぱりNGだった(ruby-1.8.7p174)。「語境界 (\w と \W のあいだにマッチ)」なので、そうだよねー、という。

\w

英数字。[0-9A-Za-z_] と同じ。

プログラミング言語 Ruby リファレンスマニュアル

[] 量指定子の対象をグループ化  量指定子の対象をグループ化 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  量指定子の対象をグループ化 - Rubyをラクガク(正規表現編)  量指定子の対象をグループ化 - Rubyをラクガク(正規表現編) のブックマークコメント

「1.4.10 丸括弧と後方参照」にて、

これまで丸括弧(())の2つの使い方について見てきた。「|」の対象を制限する使い方と、疑問符(?)やスター(*)といった、量指定子の対象をグループ化する使い方である。

とあるが、「疑問符(?)やスター(*)といった」のスターの例を見た覚えが無かったのでやってみた。

puts "/hoge(foo)*bar/ =~ 'hogefoobar': #{/hoge(foo)*bar/ =~ 'hogefoobar'}"
puts "/hoge(foo)*bar/ =~ 'hogefoofoobar': #{/hoge(foo)*bar/ =~ 'hogefoofoobar'}"
puts "/hoge(foo)*bar/ =~ 'hogefoofobar': #{/hoge(foo)*bar/ =~ 'hogefoofobar'}"
puts "/hoge(foo)*bar/ =~ 'hogebar': #{/hoge(foo)*bar/ =~ 'hogebar'}"
/hoge(foo)*bar/ =~ 'hogefoobar': 0
/hoge(foo)*bar/ =~ 'hogefoofoobar': 0
/hoge(foo)*bar/ =~ 'hogefoofobar':
/hoge(foo)*bar/ =~ 'hogebar': 0

確かに*(スター)も対象をグループ化して使うことができる。

[] 後方参照  後方参照 - Rubyをラクガク(正規表現編) を含むブックマーク はてなブックマーク -  後方参照 - Rubyをラクガク(正規表現編)  後方参照 - Rubyをラクガク(正規表現編) のブックマークコメント

正規表現 \1 \2 ... \n は、後方参照です。n 番目の括弧(正規表現 ( ) グルーピング)にマッチした文字列にマッチします。

プログラミング言語 Ruby リファレンスマニュアル

置換する時にはよくお世話になっている後方参照をマッチのみで使用する。

puts "/(hoge)(foo)\1\2/ =~ 'hogefoohogefoo': #{/(hoge)(foo)\1\2/ =~ 'hogefoohoge\
foo'}"
puts "/(hoge)(foo)\1\2/ =~ 'hogefoo': #{/(hoge)(foo)\1\2/ =~ 'hogefoo'}"
puts "/(hoge)(foo)\1*\2*/ =~ 'hogefoo': #{/(hoge)(foo)\1*\2*/ =~ 'hogefoo'}"
puts "/(hoge)(foo)\1+\2+/ =~ 'hogefoohogefoo': #{/(hoge)(foo)\1+\2+/ =~ 'hogefoo\
hogehogehogefoofoo'}"
/(hoge)(foo)^A^B/ =~ 'hogefoohogefoo': 0
/(hoge)(foo)^A^B/ =~ 'hogefoo':
/(hoge)(foo)^A*^B*/ =~ 'hogefoo': 0
/(hoge)(foo)^A+^B+/ =~ 'hogefoohogefoo': 0

正規表現リテラルをキレイに書きたい。