根据分隔符分隔单词
Separate words according to delimeter
我有一个搜索框,既可以搜索 table(space 分隔)中的内容,也可以搜索 table(冒号分隔)中的特定字段.
唯一的问题是它们可以同时存在。
示例:
- Type:Non-小说谋杀
- 非ISBN:000000001
- 小说ISBN:02平面
例1中,Type是字段名,Non-Fiction是内容,Murder是任意字段的内容。我正在寻找 Regex.Split 将 field:result 放入字典并将任何其他结果放入数组。
我已经设法让两者分开工作,但没有混合使用:
var columnSearch_FieldNames = inSearch.ToUpper().Trim().Split(':').Where((x,i) => i % 2 == 0).ToArray();
var columnSearch_FieldContent = inSearch.ToUpper().Trim().Split(':').Where((x, i) => i % 2 != 0).ToArray();
var adhocSearch_FieldContent = inSearch.ToUpper().Trim().Split(' ');
示例 4:- Type:Non-小说谋杀非 ISBN:000000001 杀死
示例输出:- 字典({Type, Non-Fiction}, {ISBN, 0000001})
数组 {Murder, Non, Kill}
如果您愿意放弃 Regex
一个很好的旧 foreach 循环与多个拆分相结合,我认为这可以实现您正在寻找的东西:
Dictionary<string, string> fields = new Dictionary<string, string>();
List<string> contents = new List<string>();
foreach (var word in main.Split(' ')) //main is a string, e.g. "Type:Non-Fiction Murder Non ISBN:000000001 Kill"
{
var splitted = word.Split(':');
if (splitted.Length == 2)
{
fields.Add(splitted[0], splitted[1]);
continue;
}
contents.Add(word);
}
基本上在 space 上拆分单词,然后在冒号上将它们分开。
如果您真的想要一个内容数组而不是 List
,只需执行 contents.ToArray()
.
我不明白为什么使用 Regex
会更快。恕我直言,我不认为使用 Regex
对代码的可读性或可维护性有任何改进。如果有的话,我认为它会更复杂。但是如果你真的想使用 Regex.Split()
,像这样的东西会起作用:
static void Main(string[] args)
{
string input = "Type:Non-Fiction Murder Non ISBN:000000001 Kill", key = null, value = null;
Dictionary<string, string> namedFields = new Dictionary<string, string>();
List<string> anyField = new List<string>();
Regex regex = new Regex("( )|(:)", RegexOptions.Compiled);
foreach (string field in regex.Split(input))
{
switch (field)
{
case " ":
_AddParameter(ref key, ref value, namedFields, anyField);
break;
case ":":
key = value;
break;
default:
value = field;
break;
}
}
_AddParameter(ref key, ref value, namedFields, anyField);
}
private static void _AddParameter(ref string key, ref string value, Dictionary<string, string> namedFields, List<string> anyField)
{
if (key != null)
{
namedFields.Add(key, value);
key = null;
}
else if (value != null)
{
anyField.Add(value);
value = null;
}
}
现在,如果您愿意只使用普通的 Regex
匹配,而不是使用 Regex.Split()
方法,有人可能会争辩说这比 readable/maintainable:
private static void UsingRegex(string input)
{
Dictionary<string, string> namedFields = new Dictionary<string, string>();
List<string> anyField = new List<string>();
Regex regex = new Regex("(?:(?<key>[^ ]+):(?<value>[^ ]+))|(?<loneValue>[^ ]+)", RegexOptions.Compiled);
foreach (Match match in regex.Matches(input))
{
string key = match.Groups["key"].Value,
value = match.Groups["value"].Value,
loneValue = match.Groups["loneValue"].Value;
if (!string.IsNullOrEmpty(key))
{
namedFields.Add(key, value);
}
else
{
anyField.Add(loneValue);
}
}
}
我有一个搜索框,既可以搜索 table(space 分隔)中的内容,也可以搜索 table(冒号分隔)中的特定字段.
唯一的问题是它们可以同时存在。 示例:
- Type:Non-小说谋杀
- 非ISBN:000000001
- 小说ISBN:02平面
例1中,Type是字段名,Non-Fiction是内容,Murder是任意字段的内容。我正在寻找 Regex.Split 将 field:result 放入字典并将任何其他结果放入数组。
我已经设法让两者分开工作,但没有混合使用:
var columnSearch_FieldNames = inSearch.ToUpper().Trim().Split(':').Where((x,i) => i % 2 == 0).ToArray();
var columnSearch_FieldContent = inSearch.ToUpper().Trim().Split(':').Where((x, i) => i % 2 != 0).ToArray();
var adhocSearch_FieldContent = inSearch.ToUpper().Trim().Split(' ');
示例 4:- Type:Non-小说谋杀非 ISBN:000000001 杀死
示例输出:- 字典({Type, Non-Fiction}, {ISBN, 0000001}) 数组 {Murder, Non, Kill}
如果您愿意放弃 Regex
一个很好的旧 foreach 循环与多个拆分相结合,我认为这可以实现您正在寻找的东西:
Dictionary<string, string> fields = new Dictionary<string, string>();
List<string> contents = new List<string>();
foreach (var word in main.Split(' ')) //main is a string, e.g. "Type:Non-Fiction Murder Non ISBN:000000001 Kill"
{
var splitted = word.Split(':');
if (splitted.Length == 2)
{
fields.Add(splitted[0], splitted[1]);
continue;
}
contents.Add(word);
}
基本上在 space 上拆分单词,然后在冒号上将它们分开。
如果您真的想要一个内容数组而不是 List
,只需执行 contents.ToArray()
.
我不明白为什么使用 Regex
会更快。恕我直言,我不认为使用 Regex
对代码的可读性或可维护性有任何改进。如果有的话,我认为它会更复杂。但是如果你真的想使用 Regex.Split()
,像这样的东西会起作用:
static void Main(string[] args)
{
string input = "Type:Non-Fiction Murder Non ISBN:000000001 Kill", key = null, value = null;
Dictionary<string, string> namedFields = new Dictionary<string, string>();
List<string> anyField = new List<string>();
Regex regex = new Regex("( )|(:)", RegexOptions.Compiled);
foreach (string field in regex.Split(input))
{
switch (field)
{
case " ":
_AddParameter(ref key, ref value, namedFields, anyField);
break;
case ":":
key = value;
break;
default:
value = field;
break;
}
}
_AddParameter(ref key, ref value, namedFields, anyField);
}
private static void _AddParameter(ref string key, ref string value, Dictionary<string, string> namedFields, List<string> anyField)
{
if (key != null)
{
namedFields.Add(key, value);
key = null;
}
else if (value != null)
{
anyField.Add(value);
value = null;
}
}
现在,如果您愿意只使用普通的 Regex
匹配,而不是使用 Regex.Split()
方法,有人可能会争辩说这比 readable/maintainable:
private static void UsingRegex(string input)
{
Dictionary<string, string> namedFields = new Dictionary<string, string>();
List<string> anyField = new List<string>();
Regex regex = new Regex("(?:(?<key>[^ ]+):(?<value>[^ ]+))|(?<loneValue>[^ ]+)", RegexOptions.Compiled);
foreach (Match match in regex.Matches(input))
{
string key = match.Groups["key"].Value,
value = match.Groups["value"].Value,
loneValue = match.Groups["loneValue"].Value;
if (!string.IsNullOrEmpty(key))
{
namedFields.Add(key, value);
}
else
{
anyField.Add(loneValue);
}
}
}