Неожиданный результат регулярного выражения с одним пробелом - PullRequest
0 голосов
/ 22 апреля 2020

Может кто-нибудь сказать мне, почему пробел подходит для 2 совпадений по приведенному ниже шаблону?

((?<key>(?:((?!\d)\w+(?:\.(?!\d)\w+)*)\.)?((?!\d)\w+)):(?<value>([^ "]+)|("[^"]*?")+))*

Попытка сопоставить следующие случаи:

var body = "Key:Hello";
var body = "Key:\"Hello\"";
var body = "Key1:Hello Key2:\"Goodbye\"";

Это может обеспечить больше context:

pattern = @"((?<key>" + StringExtensions.REGEX_IDENTIFIER_MIDSTRING + "):(?<value>([^ \"]+)|(\"[^\"]*?\")+))*";

Моя цель - вытащить ключи, значения из командной строки, например строки в виде [key]: [value] с необязательными повторениями. Значения могут быть либо без пробелов, либо в кавычках с пробелами.

Возможно, прямо передо мной, но я этого не вижу.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я выбрал другой подход:

    public static Dictionary<string, string> GetCommandLineKeyValues(this string commandLine)
    {
        var keyValues = new Dictionary<string, string>();
        var pattern = @"(?<command>(" + StringExtensions.REGEX_IDENTIFIER + " )?)(?<args>.*)";
        var args = commandLine.RegexGet(pattern, "args");
        Match match;

        if (args.Length > 0)
        {
             string key;
             string value;

             pattern = @" ?(?<key>" + StringExtensions.REGEX_IDENTIFIER_MIDSTRING + ")*?:(?<value>([^ \"]+)|(\"[^\"]*?\")+)";

            do
            {
                match = args.RegexGetMatch(pattern);

                if (match == null)
                {
                    break;
                }

                key = match.Groups["key"].Value;
                value = match.Groups["value"].Value;

                keyValues.Add(key, value);

                args = match.Replace(args, string.Empty);
            }
            while (args.RegexIsMatch(pattern));
        }

        return keyValues;
    }

Я применил то, что я называю "pa c -man" подходом к Regex ... match, eat (отсюда Match.Replace) и продолжаю соответствие.

Для удобства:

public const string REGEX_IDENTIFIER = @"^(?:((?!\d)\w+(?:\.(?!\d)\w+)*)\.)?((?!\d)\w+)$";

0 голосов
/ 22 апреля 2020

Возможно, потому что «.», Потому что точка в регулярном выражении, марширует каждый символ, кроме разрывов строк

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