C# 如何修复此正则表达式?
前言:这个问题是一个衍生问题 : 以下是我的输出:C# 如何修复此正则表达式?,c#,regex,csv,parsing,C#,Regex,Csv,Parsing,前言:这个问题是一个衍生问题 : 以下是我的输出: "TeamName","PlayerName","Position" " Chargers ","Philip Rivers","QB" " Colts ","Peyton Manning","QB" " Patriots","Tom Brady","QB" Press [ENTER] to exit. 这是我想要的结果: "TeamName","PlayerName","Position" "Chargers","Philip Riv
"TeamName","PlayerName","Position" "
Chargers
","Philip Rivers","QB" "
Colts
","Peyton Manning","QB" "
Patriots","Tom Brady","QB"
Press [ENTER] to exit.
这是我想要的结果:
"TeamName","PlayerName","Position"
"Chargers","Philip Rivers","QB"
"Colts","Peyton Manning","QB"
"Patriots","Tom Brady","QB"
Press [ENTER] to exit.
如何修复正则表达式以生成所需的输出
相关:
正如Amy已经提到的,您的字符串似乎类似于CSV。如果它真的是一个有效的CSV-使用特殊的库 如果CSVHelper在这种情况下不适用,并且您确实需要正则表达式,请尝试以下方法:
(?<=(?:^| ))(.*?)(?=(?: \")|$)
我还没有为C编写代码,所以正则表达式可能需要一些编辑,因为C是特定的
编辑。代码示例
此代码修复了断言错误的错误。但是,我无法使用onlinetool复制它:
原始正则表达式在本例中进行了注释
我希望,这会对你有所帮助。但我必须再次指出,如果您使用csv,最好使用特殊工具,而不是正则表达式:在整个线程中都有很好的评论,我强烈建议您选择其中一个选项,我不会关注它们。这里有一个替代的解决方案,它使用正则表达式模式中的匹配项,跳过有多少字段的列,然后获取需要的记录数 我正在使用一种类似\.*?[^,]的模式,可以找到它的含义的解释
const string rawLine = "\"TeamName\",\"PlayerName\",\"Position\" \"Chargers\",\"Philip Rivers\",\"QB\" \"Colts\",\"Peyton Manning\",\"QB\" \"Patriots\",\"Tom Brady\",\"QB\"";
var matches = new Regex(@"(\""(.*?)[^,]"")").Matches(rawLine).Cast<Match>().ToList();
// loop through our matches
for(int i = 0; i < matches.Count; i++)
{
// join our records we need to output
string str = string.Join(",", matches.Skip(i * 3).Take(3));
if(!string.IsNullOrEmpty(str))
Console.WriteLine(str);
}
Console.WriteLine("Press [ENTER] to exit.");
Console.ReadLine();
请注意,根本没有错误检查,可以改进,但会产生所需的输出*如果尚未导入System.Linq,请确保导入该文件
输出测试
使用负前瞻、正前瞻、quanitifer字符类、正前瞻和负前瞻
我强烈建议使用CSVHelper而不是regex,除非您确定CSV不会包含嵌入/转义引号或逗号之类的内容。CSV是一种非常灵活的格式。它甚至不需要逗号分隔就可以成为CSV。@艾米,我不熟悉CSVHelper,但我洗耳恭听。您能描述一下CSVHelper的解决方案吗?我已经很久没有需要它的服务了。在过去的几年中没有CSV:o,但我记得他们的文档相当好。请参阅。或者甚至可以使用\\n\或任何您想要的换行符替换\\。除非CSVHelper有办法指定记录分隔符,否则它不会有任何帮助。在上一个问题上删除后的一个答案提到了CSVHelper配置的Delimiter属性,但这是字段分隔符,这就是它被删除的原因。我找不到记录分隔符选项,但这并不意味着没有。另一个答案提到了拆分,在两个空格和引号中都提到了拆分,所以我们希望在转到regex然后发布这个问题之前已经探讨过了。您可以使用dotnetfiddle或regexstorm在c中测试regex。哎哟,谢谢。我错过了你提供的我可以在repl.it链接上测试的内容。她的正则表达式看起来不错。但如果C得到asserion错误,我们可以尝试脏修复。我现在就编辑我的帖子。
using System;
using System.Linq;
using System.Text.RegularExpressions;
class MainClass {
public static void Main (string[] args) {
const string rawLine = "\"TeamName\",\"PlayerName\",\"Position\" \"Chargers\",\"Philip Rivers\",\"QB\" \"Colts\",\"Peyton Manning\",\"QB\" \"Patriots\",\"Tom Brady\",\"QB\"";
//var parsedLines = Regex.Split(rawLine, "(?<=(?:^| ))(.*?)(?=(?: \")|$)");
var parsedLines = Regex.Split(rawLine, "(?<=^)(.*?)(?=(?: \")|$)|(?<= )(.*?)(?=(?: \")|$)");
parsedLines.ToList().ForEach(Console.WriteLine);
Console.WriteLine("Press [ENTER] to exit.");
Console.ReadLine();
}
}
const string rawLine = "\"TeamName\",\"PlayerName\",\"Position\" \"Chargers\",\"Philip Rivers\",\"QB\" \"Colts\",\"Peyton Manning\",\"QB\" \"Patriots\",\"Tom Brady\",\"QB\"";
var matches = new Regex(@"(\""(.*?)[^,]"")").Matches(rawLine).Cast<Match>().ToList();
// loop through our matches
for(int i = 0; i < matches.Count; i++)
{
// join our records we need to output
string str = string.Join(",", matches.Skip(i * 3).Take(3));
if(!string.IsNullOrEmpty(str))
Console.WriteLine(str);
}
Console.WriteLine("Press [ENTER] to exit.");
Console.ReadLine();
using System;
using System.Linq;
using System.Text.RegularExpressions;
class MainClass {
public static void Main (string[] args) {
const string rawLine = "\"TeamName\",\"PlayerName\",\"Position\" \"Chargers\",\"Philip Rivers\",\"QB\" \"Colts\",\"Peyton Manning\",\"QB\" \"Patriots\",\"Tom Brady\",\"QB\"";
var parsedLines = Regex.Split(rawLine, "(?<![,])(?<=[\"])[ ]{2}(?=[\"])(?![,])");
parsedLines.ToList().ForEach(Console.WriteLine);
Console.WriteLine("Press [ENTER] to exit.");
Console.ReadLine();
}
}