所以我有相当大的问题......C# - 复杂的正则表达式
我得到这样的字符串:
'x,y',2,4,'y,z'
,我需要它单独成
“的x,y”
'Y,Z'
没有我试着来到随时随地预期的结果接近...
提前感谢!
所以我有相当大的问题......C# - 复杂的正则表达式
我得到这样的字符串:
'x,y',2,4,'y,z'
,我需要它单独成
“的x,y”
'Y,Z'
没有我试着来到随时随地预期的结果接近...
提前感谢!
如果你正在寻找一个快速解决方案,试试这个(简单循环并没有正则表达式):
private static IEnumerable<string> CsvSplitter(string source) {
if (string.IsNullOrEmpty(source))
yield break; //TODO: you may want to throw exception in case source == null
int lastIndex = 0;
bool inQuot = false;
for (int i = 0; i < source.Length; ++i) {
char c = source[i];
if (inQuot)
inQuot = c != '\'';
else if (c == '\'')
inQuot = true;
else if (c == ',') {
yield return source.Substring(lastIndex, i - lastIndex);
lastIndex = i + 1;
}
}
//TODO: you can well have invalid csv (unterminated quotation):
// if (inQuot)
// throw new FormatException("Incorrect CSV");
yield return source.Substring(lastIndex);
}
样品:
string source = @"'x,y',2,4,'y,z',";
string[] result = CsvSplitter(source).ToArray();
Console.Write(string.Join(Environment.NewLine, result));
输出:
'x,y'
2
4
'y,z'
然而,在一般情况下谷歌为CSV解析器
非常感谢! Спасибо – Azeros
@Azeros:不客气! –
如果你想要去的正则表达式的方式,你可以使用
('.*?'|[^,]+)
和浏览捕获的群体,但我强烈建议您使用CSV解析器。
如果我们想要在数据中加入引号('''),就会出现一个困难。在CSV中,我们通常会*双引号*,例如: '''x,''y',2,4,'y,z'“'应该被解析为'['x','y',2 ,4,'y,z']'。这就是为什么*正则表达式*似乎是部分解决方案,我完全同意你的强烈建议。 –
如果允许没有嵌套的报价,我们可以用一个简单的正则表达式'.*?'|[^,]+
检索所需的部件:
var input = "'x,y',2,4,'y,z'";
var parts = Regex
.Matches(input, "'.*?'|[^,]+")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
Console.WriteLine(string.Join(Environment.NewLine, parts));
演示:https://dotnetfiddle.net/qo5aHz
虽然.NET味允许拟订嵌套引用一个正则表达式,它会比较困难,因此最好使用现成的CSV解析器。例如,.NET提供TextFieldParser
。
有点奇怪*计数器示例*:在CSV中我们*双引号如果我们想包含它:''''x,''y',2,4,'y,z'“'应该被解析为' ['x,''y',2,4,'y,z']' –
@DmitryBychenko:是的,你说得对,我的代码在这样的输入上会失败。这就是为什么我明确限制适用的情况。我只是想分享一个简单的在线解决方案,用于报价中不包含引号的情况。 –
你的代码在哪里? – Riad
我建议获得一个CSV解析器,而这种事情可以在正则表达式中完成,这不值得。 – juharr
@juharr CSV解析器可以做到这一点吗? – Azeros