C# C语言中的正则表达式问题#

C# C语言中的正则表达式问题#,c#,.net,regex,C#,.net,Regex,我将以下字符串作为FTP服务器的响应: 02-17-11 12月01日下午1:39 04-06-11 2011年2月11日上午11:17 05-10-11 07:09PM 87588 output.xlsx 06-10-11 02:52下午3462输出.xlsx 其中模式为:[datetime][length或][filename] 编辑:我的代码是-@“^\d{2}-\d{2}-\d{2}(+\s)+(|(\d)+)++(\s)+(.*)+” 我需要解析此对象中的这些字符串: class F

我将以下字符串作为FTP服务器的响应:

  • 02-17-11 12月01日下午1:39

  • 04-06-11 2011年2月11日上午11:17

  • 05-10-11 07:09PM 87588 output.xlsx

  • 06-10-11 02:52下午3462输出.xlsx

  • 其中模式为:
    [datetime][length或][filename]


    编辑:我的代码是-
    @“^\d{2}-\d{2}-\d{2}(+\s)+(|(\d)+)++(\s)+(.*)+”

    我需要解析此对象中的这些字符串:

    class Files{
    
    Datetime modifiedTime,
    bool ifTrueThenFile,
    string name
    
    }
    

    请注意,文件名可能有空格


    我不擅长正则表达式匹配,你能帮忙吗?

    你可以尝试以下方法:

    ^(\d\d-\d\d-\d\d)\s+(\d\d:\d\d[AP]M)\s+(\S+)\s+(.*)$
    
    第一个捕获组包含日期,第二个包含时间,第三个包含大小(或
    ),最后一个包含其他所有内容(即文件名)

    (请注意,这可能不可移植,时间格式取决于地区。)

    (\d{2})-(\d{2})-(\d{2}) (\d{2}):(\d{2})([AP]M) (<DIR>|\d+) (.+)
    
    (\d{2})-(\d{2})-(\d{2})(\d{2}):(\d{2})([AP]M)(\d+.+)
    

    我使用了很多子表达式,因此它会捕获所有相关部分,如年、小时、分钟等。也许你不需要它们,只需删除括号以防万一。

    你不需要在这里使用正则表达式。为什么不将字符串按空格分割,并加上元素数限制:

    var split = yourEntryString.Split(new string []{" "}, 4, 
        StringSplitOptions.RemoveEmptyEntries);
    var date = string.Join(" ", new string[] {split[0], split[1]});
    var length = split[2];
    var filename = split[3];
    

    这当然是假设模式是正确的,并且没有一个条目是空的。

    我喜欢发布的regex-Leif

    然而,我会给你另一个人们可能会讨厌的解决方案:我在打字时想出的又快又脏的解决方案:

    string[] allParts = inputText.Split(" ")
    allParts[0-1] = parse your DateTime
    allParts[2] = <DIR> or Size
    allParts[3-n] = string.Join(" ",...) your filename 
    
    string[]allParts=inputText.Split(“”)
    allParts[0-1]=分析日期时间
    所有零件[2]=或尺寸
    allParts[3-n]=string.Join(“,…)您的文件名
    
    那里少了一些支票,但你明白了。 这是一个很好的代码吗?可能不是。它会工作吗?当然,时间是合适的。
    它更具可读性吗?我倾向于认为“是”,但其他人可能不同意。

    您应该能够使用简单的string.split、if语句和parse/parseexact方法来实现这一点,以转换值。如果它是一个文件,则只需连接剩余的字符串标记,这样您就可以用空格重构文件名

    String regexTemp= @"(<Date>(\d\d-\d\d-\d\d\s*\d\d:\d\dA|PM)\s*(<LengthOrDir>\w*DIR\w*|\d+)\s*(<Name>.*)";
    
    Match mExprStatic = Regex.Match(regexTemp, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    if (mExprStatic.Success || !string.IsNullOrEmpty(mExprStatic.Value))
    {
      DateTime _date = DateTime.Parse(mExprStatic.Groups["lang"].Value);
      String lengthOrDir = mExprStatic.Groups["LengthOrDir"].Value;
      String Name = mExprStatic.Groups["Name"].Value;
    }
    
    String regexTemp=@“(\d\d-\d\d-\d\s*\d\d:\d\dA|PM)\s*(\w*DIR\w*\d+)\s*(*);
    Match mExprStatic=Regex.Match(regexTemp,RegexOptions.IgnoreCase | RegexOptions.Singleline);
    if(mExprStatic.Success | | |!string.IsNullOrEmpty(mExprStatic.Value))
    {
    DateTime _date=DateTime.Parse(mExprStatic.Groups[“lang”].Value);
    字符串lengthOrDir=mExprStatic.Groups[“lengthOrDir”].Value;
    String Name=mExprStatic.Groups[“Name”].Value;
    }
    
    Regex方法 一种方法是使用这个正则表达式

    @"(\d{2}-\d{2}-\d{2} \d{2}:\d{2}(?:PM|AM)) (<DIR>|\d+) (.+)";
    
    注意语法
    (?:xx)
    ,这意味着此处的内容不会被捕获到一个组中,我们需要匹配
    PM
    AM
    ,但仅此组并不重要

    接下来,我将文件大小或

    // Group 2 - Matches the file size or <DIR>
    (<DIR>|\d+)
    
    现在我们已经捕获了所有组,我们可以解析这些值:

    DateTime.Parse(g[1].Value); // be careful with current culture
                                // a different culture may not work
    
    要检查捕获的条目是否是文件,您只需检查它是
    还是数字

    IsFile = g[2].Value != "<DIR>"; // it is a file if it is not <DIR>
    
    然后,您可以使用组来构建对象,例如:

    public class Files
    {
        public DateTime ModifiedTime { get; set; }
        public bool IsFile { get; set; }
        public string Name { get; set; }
    
        public Files(GroupCollection g)
        {
            ModifiedTime = DateTime.Parse(g[1].Value);
            IsFile = g[2].Value != "<DIR>";
            Name = g[3].Value;
        }
    }
    
    static void Main(string[] args)
    {
        var p = @"(\d{2}-\d{2}-\d{2} \d{2}:\d{2}(?:PM|AM)) (<DIR>|\d+) (.+)";
        var regex = new Regex(p, RegexOptions.IgnoreCase);
    
        var m1 = regex.Match("02-17-11 01:39PM <DIR> dec");
        var m2 = regex.Match("05-10-11 07:09PM 87588 output.xlsx");
    
        // DateTime: 02-17-11 01:39PM
        // IsFile  : false
        // Name    : dec
        var file1 = new Files(m1.Groups);
    
        // DateTime: 05-10-11 07:09PM
        // IsFile  : true
        // Name    : output.xlsx
        var file2 = new Files(m2.Groups);
    }
    
    公共类文件
    {
    公共日期时间修改时间{get;set;}
    公共bool IsFile{get;set;}
    公共字符串名称{get;set;}
    公共文件(GroupCollection g)
    {
    ModifiedTime=DateTime.Parse(g[1].Value);
    IsFile=g[2]。值!=“”;
    Name=g[3]。值;
    }
    }
    静态void Main(字符串[]参数)
    {
    var p=@“(\d{2}-\d{2}-\d{2}\d{2}:\d{2}(?:PM|AM))(\d+。+)”;
    var regex=新regex(p,RegexOptions.IgnoreCase);
    var m1=正则表达式匹配(“02-17-11 01:39十二月”);
    var m2=正则表达式匹配(“05-10-11 07:09PM 87588 output.xlsx”);
    //日期时间:02-17-11 01:39下午
    //IsFile:false
    //姓名:dec
    var file1=新文件(m1.Groups);
    //日期时间:05-10-11 07:09PM
    //IsFile:true
    //名称:output.xlsx
    var file2=新文件(m2.Groups);
    }
    
    进一步阅读


    字符串操作方法 实现这一点的另一种方法是拆分字符串,该字符串的速度可以快得多:

    public class Files
    {
        public DateTime ModifiedTime { get; set; }
        public bool IsFile { get; set; }
        public string Name { get; set; }
    
        public Files(string line)
        {
            // Gets the date part and parse to DateTime
            ModifiedTime = DateTime.Parse(line.Substring(0, 16));
    
            // Gets the file information part and split
            // in two parts
            var fileBlock = line.Substring(17).Split(new char[] { ' ' }, 2);
    
            // first part tells if it is a file
            IsFile = fileBlock[0] != "<DIR>";
    
            // second part tells the name
            Name = fileBlock[1];
        }
    }
    
    static void Main(string[] args)
    {
        // DateTime: 02-17-11 01:39PM
        // IsFile  : false
        // Name    : dec
        var file3 = new Files("02-17-11 01:39PM <DIR> dec");
    
        // DateTime: 05-10-11 07:09PM
        // IsFile  : true
        // Name    : out put.xlsx
        var file4 = new Files("05-10-11 07:09PM 87588 out put.xlsx");
    }
    
    公共类文件
    {
    公共日期时间修改时间{get;set;}
    公共bool IsFile{get;set;}
    公共字符串名称{get;set;}
    公共文件(字符串行)
    {
    //获取日期部分并解析为DateTime
    ModifiedTime=DateTime.Parse(line.Substring(0,16));
    //获取文件信息部分并拆分
    //分两部分
    var fileBlock=line.Substring(17).Split(新字符[]{''},2);
    //第一部分说明它是否是一个文件
    IsFile=fileBlock[0]!=“”;
    //第二部分讲述了名字
    Name=fileBlock[1];
    }
    }
    静态void Main(字符串[]参数)
    {
    //日期时间:02-17-11 01:39下午
    //IsFile:false
    //姓名:dec
    var file3=新文件(“02-17-11 01:39十二月”);
    //日期时间:05-10-11 07:09PM
    //IsFile:true
    //名称:out put.xlsx
    var file4=新文件(“05-10-11 07:09PM 87588 out.xlsx”);
    }
    
    进一步阅读


      • 有很多不错的答案,但我喜欢正则表达式拼图,所以我想我应该提供一个稍微不同的版本

        ^([\d- :]{14}[A|P]M)\s+(<DIR>|\d+)\s(.+)$
        
        ^([\d-:]{14}[A | P]M)\s+(|\d+)\s(+)$
        

        为了帮助测试,我总是使用这个网站:

        到目前为止你尝试了什么?还要注意,regex并不是真正需要的。你可以对此做一个非常简单的解析。了解如何做,例如,在这里尝试一个我喜欢使用的工具是@tster:having error in my regex:
        @“^\d{2}-\d{2}-\d{2}++(|(\d)++)+(\s)++(*s+)”
        并将datetime设置为
        time={0}
        …但是
        time
        是empty@Damokles当前位置我读了,但失败了
        public class Files
        {
            public DateTime ModifiedTime { get; set; }
            public bool IsFile { get; set; }
            public string Name { get; set; }
        
            public Files(GroupCollection g)
            {
                ModifiedTime = DateTime.Parse(g[1].Value);
                IsFile = g[2].Value != "<DIR>";
                Name = g[3].Value;
            }
        }
        
        static void Main(string[] args)
        {
            var p = @"(\d{2}-\d{2}-\d{2} \d{2}:\d{2}(?:PM|AM)) (<DIR>|\d+) (.+)";
            var regex = new Regex(p, RegexOptions.IgnoreCase);
        
            var m1 = regex.Match("02-17-11 01:39PM <DIR> dec");
            var m2 = regex.Match("05-10-11 07:09PM 87588 output.xlsx");
        
            // DateTime: 02-17-11 01:39PM
            // IsFile  : false
            // Name    : dec
            var file1 = new Files(m1.Groups);
        
            // DateTime: 05-10-11 07:09PM
            // IsFile  : true
            // Name    : output.xlsx
            var file2 = new Files(m2.Groups);
        }
        
        public class Files
        {
            public DateTime ModifiedTime { get; set; }
            public bool IsFile { get; set; }
            public string Name { get; set; }
        
            public Files(string line)
            {
                // Gets the date part and parse to DateTime
                ModifiedTime = DateTime.Parse(line.Substring(0, 16));
        
                // Gets the file information part and split
                // in two parts
                var fileBlock = line.Substring(17).Split(new char[] { ' ' }, 2);
        
                // first part tells if it is a file
                IsFile = fileBlock[0] != "<DIR>";
        
                // second part tells the name
                Name = fileBlock[1];
            }
        }
        
        static void Main(string[] args)
        {
            // DateTime: 02-17-11 01:39PM
            // IsFile  : false
            // Name    : dec
            var file3 = new Files("02-17-11 01:39PM <DIR> dec");
        
            // DateTime: 05-10-11 07:09PM
            // IsFile  : true
            // Name    : out put.xlsx
            var file4 = new Files("05-10-11 07:09PM 87588 out put.xlsx");
        }
        
        ^([\d- :]{14}[A|P]M)\s+(<DIR>|\d+)\s(.+)$