regex
しょっちゅう忘れて全く記憶に残らないのでメモ 実際のところ X=300だとかy=99みたいな感じで文字列が入ってくる際、左辺と右辺をそれぞれパースしたい場合は以下のように import re pt = re.compile(r'(x|y)=(\d{1,5})') mt = pt.match("x=100") mt[1] #>> …
詳説 正規表現 第3版作者:Jeffrey E.F. Friedl発売日: 2008/04/26メディア: 大型本再帰表現と正規表現を書き下しできればエンジニアの上位20%という説がまことしやかに囁かれております。 その真偽はともかく、正規という奴はそれ自体が極めて強力なツー…
鬼車の文字列集合オプションはascii、unicodeとマッチパターンを切り替えできます。 これを活かすと、alnumが日本語を拾うという、怪挙動を抑制する事ができます 実際のところ まず何もしない場合。almum……つまり0-9a-zA-Zだけにマッチすべきところ、 漢字も…
非欲張りな量指定子をつかうと、パターンマッチの範囲を最初のものだけに限定することができます。 局面によっては非常に有用です。 実際のところ たとえば、次のようなhtml文章があったとします。 ここから最初のタグ内容を抽出するケースを考えます。 cons…
Regex#execやRegex#testを使う場合の注意点です。 実際のところ myArray = myRe.exec(str) /* [ 'Pacem,', '', 'Pacem', ',', index: 7, input: 'Si Vis Pacem, Para Bellum' ] */ さて、ここでArray#lastIndexの数字を細工してみます myRe.lastIndex = 2 //…
javascriptのRegex#execを使うと、正規表現=>文字列の順で並べる事ができます。 実際のところ 基本的挙動 結果は配列に格納されます。 最初:マッチした全文 以降:マッチしたワード index:マッチした先頭文字番号 input:入力した全文 (/(\b)(\w+)(,*)/g).…
冷静に振り返れば当たり前だったのですが、何故か解決に時間がかかったのでメモ。 実際のところ 単純にN文字毎に切り分ける 世界で一番長い名前らしい「Captain Fantastic Faster Than Superman Spiderman Batman Wolverine Hulk And The Flash Combined」さ…
今までそんな事も知らずに正規表現使ってたのかよ……って話ですが 正規表現パターンの末尾に「i」をつけることで大文字小文字を無視できます。 実際のところ "hoge" =~ /HoGe/ # => nil "hoge" =~ /HoGe/i #=> 0 参考もと 正規表現 (Ruby 1.9.3)
まぁ考えてみれば当たり前なのですが……「1」「01」と両方のパターンがあり得る場合の正規表現は "4" =~ /[0]*\d+/ #>> 0 "034" =~ /[0]*\d+/ #>> 0 です。 "*"は0個以上、"+"は1個以上続く場合ですから、 あたまの0はあってもなくても一致します。 参…
先日の最後の要素を引っ張り出す事例をGrepの魔法を使って書き直すと $ echo http://s3.amazonaws.com/downloads.basho.com/stanchion/1.5/1.5.0/osx/10.8/stanchion-1.5.0-OSX-x86_64.tar.gz | grep -o '[^\/]*$'となります。oオプションは -o, --only-matc…
正規表現で単語境界にマッチさせる場合、 以前扱った\bや$以外にも別の方法があります。数値の文字列を三桁区切りする正規表現で考えると "123456".gsub(/(?<=\d)(?=(\d\d\d)+\b)/, ",") => "123,456" は "123456".gsub(/(?<=\d)(?=(\d\d\d)+(?!\d))/, ",") …
正規表現におけるアンカーの一つ、\bは単語の境界にマッチします。 単語の両端を括れば、前後に余計な文字が入っているものを除外できます。 /foobar/.match("foobarii") #=> #<MatchData "foobar"> /\bfoobar\b/.match("foobarii") #=> nil ・・・では、この単語の境界ってナン</matchdata>…
前の記事の続きです。 肯定前方読みという、やや特殊な正規表現の記法を使うと「最後だけ除く」といった If文が必要となりそうな話も一行で書く事ができます。 たとえばクレジットカードの認証なんかで良くある、「末尾4桁だけは表示する」ような仕組みの場…
/^(?:([AE][0-9]{7})|(IN:\g<1>Q))$/ という正規表現に対しては "J0125556" "IN:E0123463Q" という文字列がマッチします。 「(?:pat)」というグループ化しない記法で囲んでおくとキャプチャが作成されず一寸だけ性能が増します。 /^(?:([AE][0-9]{7})|(IN:\g…
Rubyにも、後方一致というオプションがついてます。 これを使うと、特定パターンに続く文字列を抽出する事が可能となります /(?<=<b>)\w+(?=<\/b>)/.match("Fortune favours the <b>bold</b>") # => #<MatchData "bold"> 参考もと 正規表現 ruby - Is there any way to shorten this regu</matchdata></b>…