首页 > 解决方案 > 带有单个空格的意外正则表达式结果

问题描述

有人可以告诉我为什么一个空格会为以下模式提供 2 个匹配项吗?

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

尝试匹配以下情况:

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

这可能会提供更多上下文:

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

我的目标是以 [key]:[value] 的形式从命令行中提取键和值,并带有可选的重复项。值可以是不带空格的 a,也可以是带空格的引号。

可能就在我面前,但我没有看到它。

标签: c#.netregex

解决方案


我采取了不同的方法:

    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;
    }

我对 Regex 采用了我称之为“吃豆人”的方法。匹配、吃(因此是 Match.Replace),然后继续匹配。

为了方便:

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


推荐阅读