为什么这个正则表达式在RegexBuddy中工作但在.NET中不工作

时间:2010-09-07 14:29:40

标签: .net regex

是否有理由不能在via .Net中使用但在RegexBuddy中有效?

字符串:

formatter:'number',formatoptions:{decimalSeparator:'.',decimalPlaces:2,defaulValue:0}

表达模式:

[a-zA-Z]+:({)??([a-zA-Z]+[:](')??[a-zA-Z0-9.,]+(?(3)'|,?),?)+(?(1)}|.)

在regex buddy中生成匹配但在.net内失败。

private static List<string> GetObjectProps(this string str, out string strWithOutObjectProps)
{
    var lst = new List<String>();
    var temp = str;
    Regex RegexObj = new Regex("[a-zA-Z]+:({)??([a-zA-Z]+[:](')??[a-zA-Z0-9.,]+(?(3)'|,?),?)+(?(1)}|.)");
    Match MatchResults = RegexObj.Match(str);

    while(MatchResults.Success) //fails
    {
        lst.Add(MatchResults.Value);
        temp = MatchResults.Index > 0
                   ? temp.Substring(0, MatchResults.Index - 1) +
                     temp.Substring(MatchResults.Index + MatchResults.Length)
                   : temp.Substring(MatchResults.Index + MatchResults.Length);

        MatchResults = MatchResults.NextMatch();
    }

    strWithOutObjectProps = temp;
    return lst;
}

解决方案!

原来这个冲突发生在较旧的regexbuddy上,最新版本指出了.net模拟的错误。

重写表达:

new Regex(@"\s?\b[a-zA-Z]+\b:\{
           (?:
             \b[a-zA-Z]+\b:
             (?:[0-9]+|'[.,]?'|'[\w]+'),?
           )+
           \}",
           RegexOptions.IgnorePatternWhitespace);

虽然这个表达式不完美,但是必须使分隔符可选,以避免尾随分隔符,任何想法如何避免这种情况?

2 个答案:

答案 0 :(得分:0)

我知道RegexBuddy模仿.NET Regex引擎。它实际上并不直接运行它。例如,限制包括lack of support for balancing groups。但是你可能偶然发现了其他一些不相容的东西。您可能需要contact them关于它或在论坛上发帖,以便他们可以查看。

作为测试,您还可以尝试使用直接从.NET Regex引擎运行的Regex Hero的正则表达式。

答案 1 :(得分:0)

经过一些调整后,这就是我想出的:

var reg = new Regex("\s+(?<name>[a-zA-Z]*)\s+:\s+(?<value>('.*')|(\".*\")|[^,}]*)");
var input = "{ decimalSeparator : \",\", decimalPlaces : 2, defaulValue : 0 }";
var matches = reg.Matches(input);
var name = matches[0].Groups["name"];
var value = matches[0].Groups["value"];

我对你想要的东西做了一些假设,所以如果他们错了就告诉我。