私はここでしばらく立ち往生しており、正規表現を使用したNEsperの不適切な動作に問題があるようです。問題を再現するための簡単なプロジェクトを作成しました。これはgithubから入手できます。
簡単に言うと、NEsper を使用すると、メッセージ (イベント) を一連のルール (SQL に似たもの) を通して送り込むことができます。イベントがルールに一致する場合、NEsper はアラートを発します。私のアプリケーションでは、正規表現を使用する必要がありますが、これは機能していないようです。
問題ステートメントを作成する両方
の方法を試しましたが、一致イベントは発生しませんが、正規表現と入力は .NET Regex クラスによって一致しています。正規表現 ("\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\b") の代わりに、一致する値 (" 127.0.0.5") をステートメントに追加すると、イベントは正常に発生します。 createPattern
createEPL
入力 127.0.0.5 ==ルール失敗== every (Id123=TestDummy(Value regexp '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')) // そしてこれを渡したい ==ルールパス== 毎 (Id123=TestDummy(Value regexp '127.0.0.5'))
質問
NEsper 正規表現マッチングのサンプルを教えてくれる人はいますか? または、コード内の私のばかげた間違いを指摘してください。
コード
これは私の NEsper デモ ラッパー クラスです。
public class NesperAdapter
{
public MatchEventSubscrtiber Subscriber { get; set; }
internal EPServiceProvider Engine { get; private set; }
public NesperAdapter()
{
//This call internally depend on log4net,
//will throw an error if log4net cannot be loaded
EPServiceProviderManager.PurgeDefaultProvider();
//config
var configuration = new Configuration();
configuration.AddEventType("TestDummy", typeof(TestDummy).FullName);
configuration.EngineDefaults.Threading.IsInternalTimerEnabled = false;
configuration.EngineDefaults.Logging.IsEnableExecutionDebug = false;
configuration.EngineDefaults.Logging.IsEnableTimerDebug = false;
//engine
Engine = EPServiceProviderManager.GetDefaultProvider(configuration);
Engine.EPRuntime.SendEvent(new TimerControlEvent(TimerControlEvent.ClockTypeEnum.CLOCK_EXTERNAL));
Engine.Initialize();
Engine.EPRuntime.UnmatchedEvent += OnUnmatchedEvent;
}
public void AddStatementFromRegExp(string regExp)
{
const string pattern = "any (Id123=TestDummy(Value regexp '{0}'))";
string formattedPattern = String.Format(pattern, regExp);
EPStatement statement = Engine.EPAdministrator.CreatePattern(formattedPattern);
//this is subscription
Subscriber = new MatchEventSubscrtiber();
statement.Subscriber = Subscriber;
}
internal void OnUnmatchedEvent(object sender, UnmatchedEventArgs e)
{
Console.WriteLine(@"Unmatched event");
Console.WriteLine(e.Event);
}
public void SendEvent(object someEvent)
{
Engine.EPRuntime.SendEvent(someEvent);
}
}
次に、サブスクライバーと DummyType
public class MatchEventSubscrtiber
{
public bool HasEventFired { get; set; }
public MatchEventSubscrtiber()
{
HasEventFired = false;
}
public void Update(IDictionary<string, object> rows)
{
Console.WriteLine("Match event fired");
Console.WriteLine(rows);
HasEventFired = true;
}
}
public class TestDummy
{
public string Value { get; set; }
}
そしてNUnitテスト。1 つのコメントが nesper.AddStatementFromRegExp(regexp); の場合。行と行のコメントを外し//nesper.AddStatementFromRegExp(input);
てから、テストに合格します。ただし、そこには正規表現が必要です。
//Match any IP address
[TestFixture(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", "127.0.0.5")]
public class WhenValidRegexpPassedAndRuleCreatedAndPropagated
{
private NesperAdapter nesper;
//Setup
public WhenValidRegexpPassedAndRuleCreatedAndPropagated(string regexp, string input)
{
//check it is valid regexp in .NET
var r = new Regex(regexp);
var match = r.Match(input);
Assert.IsTrue(match.Success, "Regexp validation failed in .NET");
//create and start engine
nesper = new NesperAdapter();
//Add a rule, this fails with a correct regexp and a matching input
//PROBLEM IS HERE
nesper.AddStatementFromRegExp(regexp);
//PROBLEM IS HERE
//This works, but it is just input self-matching
//nesper.AddStatementFromRegExp(input);
var oneEvent = new TestDummy
{
Value = input
};
nesper.SendEvent(oneEvent);
}
[Test]
public void ThenNesperFiresMatchEvent()
{
//wait till nesper process the event
Thread.Sleep(100);
//Check if subscriber has received the event
Assert.IsTrue(nesper.Subscriber.HasEventFired,
"Event didn't fire");
}
}