Почему это регулярное выражение работает в RegexBuddy, а не в .NET - PullRequest
1 голос
/ 07 сентября 2010

Есть ли причина, по которой следующее не должно работать в .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;
}

Решение!

Оказывается, этот конфликт был на / c более старого regexbuddy, последняя версия указала наошибка для симуляции .net.

Переработанное выражение:

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

Несмотря на то, что это выражение не идеально из-за необходимости сделать разделитель необязательным, чтобы избежать конечного разделителяЛюбые идеи, так как, как этого избежать?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2010

После небольшой настройки я пришел к следующему:

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"];

Я сделал несколько предположений о том, что вы хотели, поэтому дайте мне знать, если они не правы.

0 голосов
/ 07 сентября 2010

Я знаю, что RegexBuddy эмулирует движок .NET Regex.На самом деле он не запускается напрямую.Ограничения включают, например, отсутствие поддержки балансировочных групп .Но вы, возможно, только что наткнулись на какую-то другую несовместимость.Вы можете связаться с ними об этом или опубликовать на их форуме, чтобы они могли посмотреть его.

В качестве теста вы также можете попробовать регулярное выражение с Regex Hero который запускается непосредственно из движка .NET Regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...