C# 带有regexp的NEsper问题

C# 带有regexp的NEsper问题,c#,regex,events,nesper,C#,Regex,Events,Nesper,我在这里呆了很长一段时间,似乎把问题归咎于regex不正确的NEsper行为。我写了一个简单的项目来重现这个问题,它可以从 简而言之,NEsper允许我通过一组规则(类似SQL)来传递消息(事件)。如果事件与规则匹配,NEsper将发出警报。在我的应用程序中,我需要使用a,但这似乎不起作用 问题 我尝试了createPattern和createpl这两种方法,它们没有触发匹配事件,但是正则表达式和输入由.NET正则表达式类匹配。如果我将匹配值(“127.0.0.5”)传递给语句,而不是regex

我在这里呆了很长一段时间,似乎把问题归咎于regex不正确的NEsper行为。我写了一个简单的项目来重现这个问题,它可以从

简而言之,NEsper允许我通过一组规则(类似SQL)来传递消息(事件)。如果事件与规则匹配,NEsper将发出警报。在我的应用程序中,我需要使用a,但这似乎不起作用

问题
我尝试了
createPattern
createpl
这两种方法,它们没有触发匹配事件,但是正则表达式和输入由.NET正则表达式类匹配。如果我将匹配值(“127.0.0.5”)传递给语句,而不是regex(“\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\b”),则事件将成功触发

INPUT 127.0.0.5 ==RULE FAIL== every (Id123=TestDummy(Value regexp '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')) // and I want this to pass ==RULE PASS== every (Id123=TestDummy(Value regexp '127.0.0.5')) 然后是订阅服务器和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; }
}

我调试这个问题已经有一段时间了,发现NEsper处理错误

其中regexp'foobar'
语句

所以如果我有

从MyType中选择*属性a regexp“一些有效的regexp”

NEsper使用“一些有效的regexp”执行字符串格式化和验证,并从regexp中删除重要(和有效)符号。这就是我为自己修好的方法。不确定这是否是推荐的方法

文件:com.espertech.esper.epl.expression.ExprRegexpNode 原因:我认为这取决于用户如何构造regexp,这不应该是框架的一部分

文件:com.espertech.esper.epl.parse.astconthelper 原因:所有字符串都需要requireUnescape,但跳过regexp,因为这会阻止有效的regexp并从中删除一些有效符号

文件:com.espertech.esper.type.StringValue 原因:取消显示所有字符串,但不显示regexp值


我调试这个问题已经有一段时间了,发现NEsper处理错误

其中regexp'foobar'
语句

所以如果我有

从MyType中选择*属性a regexp“一些有效的regexp”

NEsper使用“一些有效的regexp”执行字符串格式化和验证,并从regexp中删除重要(和有效)符号。这就是我为自己修好的方法。不确定这是否是推荐的方法

文件:com.espertech.esper.epl.expression.ExprRegexpNode 原因:我认为这取决于用户如何构造regexp,这不应该是框架的一部分

文件:com.espertech.esper.epl.parse.astconthelper 原因:所有字符串都需要requireUnescape,但跳过regexp,因为这会阻止有效的regexp并从中删除一些有效符号

文件:com.espertech.esper.type.StringValue 原因:取消显示所有字符串,但不显示regexp值

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; }
}
//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");
    }
}
// Inside this method
public object Evaluate(EventBean[] eventsPerStream, bool isNewData, ExprEvaluatorContext exprEvaluatorContext){...}

// Find two occurrences of
_pattern = new Regex(String.Format("^{0}$", patternText));

// And change to
_pattern = new Regex(patternText);
// Inside this method  
public static Object Parse(ITree node){...}

// Find one occurrence of
case EsperEPL2GrammarParser.STRING_TYPE:
{
    return StringValue.ParseString(node.Text, requireUnescape);
}

// And change to
case EsperEPL2GrammarParser.STRING_TYPE:
{
bool requireUnescape = true;

if (node.Parent != null)
{
    if (!String.IsNullOrEmpty(node.Parent.Text))
    {
        if (node.Parent.Text == "regexp")
        {
            requireUnescape = false;
        }
    }
}

return StringValue.ParseString(node.Text, requireUnescape);
}
// Inside this method  
public static String ParseString(String value){...}

// Change from
public static String ParseString(String value)
{
    if ((value.StartsWith("\"")) & (value.EndsWith("\"")) || (value.StartsWith("'")) & (value.EndsWith("'")))
    {
        if (value.Length > 1)
        {               
            if (value.IndexOf('\\') != -1)
            {
                return Unescape(value.Substring(1, value.Length - 2));
            }

            return value.Substring(1, value.Length - 2);
        }
    }

    throw new ArgumentException("String value of '" + value + "' cannot be parsed");
}   

// Change to
public static String ParseString(String value, bool requireUnescape = true)
{
    if ((value.StartsWith("\"")) & (value.EndsWith("\"")) || (value.StartsWith("'")) & (value.EndsWith("'")))
    {
        if (value.Length > 1)
        {
            if (requireUnescape)
            {
                if (value.IndexOf('\\') != -1)
                {
                    return Unescape(value.Substring(1, value.Length - 2));
                }
            }

            return value.Substring(1, value.Length - 2);
        }
    }

    throw new ArgumentException("String value of '" + value + "' cannot be parsed");
}