Skip to content

Instantly share code, notes, and snippets.

@wilfrem
Created April 5, 2013 19:21
Show Gist options
  • Save wilfrem/5321876 to your computer and use it in GitHub Desktop.
Save wilfrem/5321876 to your computer and use it in GitHub Desktop.
monoのregular exceptionのバグ
monoのRegexバグを踏んだのでメモっておく
現在(mono 3.0.7)で治ってない。
バグ報告スレ
https://bugzilla.xamarin.com/show_bug.cgi?id=2663
自分が踏んだバグが
IronRubyをUbuntuのmonoに入れたらgemが動かないというバグでした
問題の箇所が
rubygems/requirement.rbのparseでArgumentErrorを吐いて落ちるというバグ
何が問題かというと正規表現にバグがあって
>|>=を条件によってはmatchできなくなるバグ
まだ治ってないので
とりあえずのパッチとしては
http://www.ruby-forum.com/topic/1864531
ここにあるようにrequirement.rbを
OPS = { #:nodoc:
"=" => lambda { |v, r| v == r },
"!=" => lambda { |v, r| v != r },
- ">" => lambda { |v, r| v > r },
- "<" => lambda { |v, r| v < r },
">=" => lambda { |v, r| v >= r },
"<=" => lambda { |v, r| v <= r },
+ ">" => lambda { |v, r| v > r },
+ "<" => lambda { |v, r| v < r },
"~>" => lambda { |v, r| v = v.release; v >= r && v < r.bump }
}
という感じに直せばとりあえずは動きます。
バグのtestコード
using System;
using System.Text.RegularExpressions;
public static class Program
{
public static void Main(string[] args)
{
Console.WriteLine(Regex.IsMatch("AB",@"^(A|AB)?$"));
Console.WriteLine(Regex.IsMatch("AB",@"^(AB|A)?$"));
Console.WriteLine(Regex.IsMatch("A",@"^(A|AB)?$"));
Console.WriteLine(Regex.IsMatch("A",@"^(AB|A)?$"));
}
}
これの一つ目だけFalseになる。。。
このバグを踏まないようにするには
|を使うときは長い方を先にする方が良さげ
@wilfrem
Copy link
Author

wilfrem commented Apr 6, 2013

と思ったけど、OptionParserとかでエラー出まくるのか。。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment