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();
  }
}