我需要拆分逗号分隔的字符串,其内容有时在引号之间。一个例子可能是:
1," TEST",22345," 18,95",Ab" cde
这里的第一个问题是仅当逗号没有被" 18,95"等引号包围时才分割字符串。我用一个简单的正则表达式做到了这一点。下一个问题是删除引号,它们围绕内容。对于" TEST"和" 18,95"引号应该删除.Ab" cde中的引用应保持不变。到目前为止,这是我的代码:
List<string> results = Regex.Matches(this.Content, @"[\""](.+?)[\""]|[^,]+")
.Cast<Match>()
.Select(m => m.Value)
.Select(s => s.StartsWith("\"") && s.EndsWith("\"") ? s.Remove(1,1).Remove(s.Length-1,1) : s)
.ToList();
对于第二个Select
,我得到ArgumentOutOfRangeException
,因为第二个Remove
不再使用s
。我认为它应该有效,但不知何为没有。
如果有更好的方法,我会很乐意了解它。
答案 0 :(得分:2)
您可以捕获具有相同名称的命名捕获组中的引号和未引用值之间的值,并使用Match.Groups["group_name"]
检索匹配的捕获:
List<string> results = Regex.Matches(this.Content, @"[\""](?<value>.+?)[\""]|(?<value>[^,]+)")
.Cast<Match>()
.Select(m => m.Groups["value"].Value)
.ToList();
演示:https://dotnetfiddle.net/M8lJDR
要考虑潜在的空值,请将+
更改为*
并使用(?<=^|,)
和(?=,|$)
围绕正则表达式:
List<string> results = Regex.Matches(input,
@"(?<=^|,)(?:""(?<value>.*?)""|(?<value>[^,]*))(?=,|$)")
.Cast<Match>()
.Select(m => m.Groups["value"].Value)
.ToList();
答案 1 :(得分:0)
调用s.Remove(1,1)
后,生成的字符串将短于s
(保持不变)!
使用
s.Remove(1,1).Remove(s.Length-2,1)
或
s.Remove(s.Length-1,1).Remove(1,1)
而不是
s.Remove(1,1).Remove(s.Length-1,1)
s="\""
时,这仍然会失败。为了解决这个问题,您必须更新条件:
s.StartsWith("\"") && s.EndsWith("\"") && s.Length > 1 ? s.Remove(s.Length-1,1).Remove(1,1) : s
答案 2 :(得分:0)
如何使用.Substring()
:
List<string> results = Regex.Matches(content, @"[\""](.+?)[\""]|[^,]+")
.Cast<Match>()
.Select(m => m.Value)
.Select(s => s.StartsWith("\"") && s.EndsWith("\"")
? s.Substring(1, s.Length - 2) : s)
.ToList();
输出:
1
TEST
22345
18,95
Ab"cde
注意:对于包含2个以上引号的部分,""test""work"",1
答案 3 :(得分:0)
也许你可以遍历每个/
和:
results