C# C语言中的正则表达式问题#
我将以下字符串作为FTP服务器的响应: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
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(.+)$