如何在linq查询中替换字符串列表中的字符或将其前置



我有一个类似于这个Hello [name] [lastname]的字符串

然后我通过List<string> = "Hello [name] [lastname]".Split(" ").ToList()"将其转换为list<string>

问题是,我需要将Hello [name] [lastname]作为'Hello' name lastname,并以此方式存储在列表中。

更改字符串的问题是,我无法想出一种方法,既可以删除[],又可以添加单个quoutes,而不必使用多个替换多次遍历字符串?

用一个命令就能做到吗?-比如定义一条规则?

您可以使用正则表达式来识别字符串中的单词和[标记]。然后在Regex.Replace中使用匹配计算器,您可以应用自定义规则将单词用单引号括起来,对于令牌,Regex捕获组已经为我们去掉了周围的方括号。

例如,

var output = Regex
.Replace("Hello [name] [lastname]", @"[(?<token>.+?)]|(?<word>[^s]+)", (match) =>
{
var wordMatch = match.Groups["word"];
if (wordMatch.Success) return $"'{wordMatch.Value}'";
return match.Groups["token"].Value;
})
.Split(' ')
.ToList();

将输出以下列表:

[0] 'Hello'
[1] name
[2] lastname

如果您的输入字符串总是以Hello开头,那么解决方案将是:

List<string> output = new List<string>() { "'Hello'" }.Concat(input.Split(new char[] { '[', ' ', ']' }, StringSplitOptions.RemoveEmptyEntries).Skip(1)).ToList();

否则,如果输入字符串的第一个单词没有固定,那么您可以执行以下操作:

List<string> output = new List<string>() { $"'{input.Split(' ')[0]}'" }.Concat(input.Split(new char[] { '[', ' ', ']' }, StringSplitOptions.RemoveEmptyEntries).Skip(1)).ToList();

但是,我建议将此代码拆分为多行,而不是像您要求的那样使用单个命令。

最新更新