c# - 带有单个空格的意外正则表达式结果
问题描述
有人可以告诉我为什么一个空格会为以下模式提供 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,也可以是带空格的引号。
可能就在我面前,但我没有看到它。
解决方案
我采取了不同的方法:
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+)$";
推荐阅读
- python - 没有循环的Python Spacy相似性?
- c# - 如何在不使用 TryFindResource 的情况下从代码隐藏中获取 StaticResource 的实际对象?
- python - 计算熊猫的 Tf-Idf 分数?
- java - 发现能够从类型 [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] 转换的转换器
- google-drive-api - 无法与知道链接的任何人以及组织外部的人共享团队云端硬盘中的文件
- r - 如何使用正则表达式和 R 提取匹配上方的行?
- c# - datetimepicker 没有正确过滤 datagridview 数据
- c - 可执行代码的高性能 malloc 实现
- python - 使用带有 scipy 的 rbf 导致的内存错误
- javascript - 通过 props 传递函数后的反应和检查条件