Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

regex

pythonの正規表現まわり

しょっちゅう忘れて全く記憶に残らないのでメモ 実際のところ X=300だとかy=99みたいな感じで文字列が入ってくる際、左辺と右辺をそれぞれパースしたい場合は以下のように import re pt = re.compile(r'(x|y)=(\d{1,5})') mt = pt.match("x=100") mt[1] #>> …

【読書メモ】詳説 正規表現 第3版

詳説 正規表現 第3版作者:Jeffrey E.F. Friedl発売日: 2008/04/26メディア: 大型本再帰表現と正規表現を書き下しできればエンジニアの上位20%という説がまことしやかに囁かれております。 その真偽はともかく、正規という奴はそれ自体が極めて強力なツー…

鬼車の文字列集合オプションをつかって、alnumが日本語を拾う怪挙動を抑制する

鬼車の文字列集合オプションはascii、unicodeとマッチパターンを切り替えできます。 これを活かすと、alnumが日本語を拾うという、怪挙動を抑制する事ができます 実際のところ まず何もしない場合。almum……つまり0-9a-zA-Zだけにマッチすべきところ、 漢字も…

非欲張りな量指定子をつかうと、パターンマッチの範囲を限定できる

非欲張りな量指定子をつかうと、パターンマッチの範囲を最初のものだけに限定することができます。 局面によっては非常に有用です。 実際のところ たとえば、次のようなhtml文章があったとします。 ここから最初のタグ内容を抽出するケースを考えます。 cons…

Regex#execやRegex#testはlastIndexを参照しているので注意

Regex#execやRegex#testを使う場合の注意点です。 実際のところ myArray = myRe.exec(str) /* [ 'Pacem,', '', 'Pacem', ',', index: 7, input: 'Si Vis Pacem, Para Bellum' ] */ さて、ここでArray#lastIndexの数字を細工してみます myRe.lastIndex = 2 //…

Regex#execを使うと、正規表現=>文字列の順で並べる事ができる。

javascriptのRegex#execを使うと、正規表現=>文字列の順で並べる事ができます。 実際のところ 基本的挙動 結果は配列に格納されます。 最初:マッチした全文 以降:マッチしたワード index:マッチした先頭文字番号 input:入力した全文 (/(\b)(\w+)(,*)/g).…

N文字|要素ごとに改行する正規表現

冷静に振り返れば当たり前だったのですが、何故か解決に時間がかかったのでメモ。 実際のところ 単純にN文字毎に切り分ける 世界で一番長い名前らしい「Captain Fantastic Faster Than Superman Spiderman Batman Wolverine Hulk And The Flash Combined」さ…

大文字小文字を無視するiオプション

今までそんな事も知らずに正規表現使ってたのかよ……って話ですが 正規表現パターンの末尾に「i」をつけることで大文字小文字を無視できます。 実際のところ "hoge" =~ /HoGe/ # => nil "hoge" =~ /HoGe/i #=> 0 参考もと 正規表現 (Ruby 1.9.3)

「1」「01」と両方のパターンがあり得る場合の正規表現

まぁ考えてみれば当たり前なのですが……「1」「01」と両方のパターンがあり得る場合の正規表現は "4" =~ /[0]*\d+/ #>> 0 "034" =~ /[0]*\d+/ #>> 0 です。 "*"は0個以上、"+"は1個以上続く場合ですから、 あたまの0はあってもなくても一致します。 参…

Grepの「-o」オプションを活用し最後に一致した要素だけ出力する

先日の最後の要素を引っ張り出す事例を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…

単語境界にマッチさせる場合、(?!\w)と書く方法もある。

正規表現で単語境界にマッチさせる場合、 以前扱った\bや$以外にも別の方法があります。数値の文字列を三桁区切りする正規表現で考えると "123456".gsub(/(?<=\d)(?=(\d\d\d)+\b)/, ",") => "123,456" は "123456".gsub(/(?<=\d)(?=(\d\d\d)+(?!\d))/, ",") …

\bは単語境界にマッチする…じゃあ単語境界って何よ? というお話

正規表現におけるアンカーの一つ、\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>…