[英]A way to use RegEx to find a set of filenames paths in a string
早上好家伙
有没有一种在C#中使用正则表达式的好方法,以便在string
变量中查找所有文件名及其路径?
例如,如果您有此字符串:
string s = @"Hello John
these are the files you have to send us today: <file>C:\Development\Projects 2010\Accounting\file20101130.csv</file>, <file>C:\Development\Projects 2010\Accounting\orders20101130.docx</file>
also we would like you to send <file>C:\Development\Projects 2010\Accounting\customersupdated.xls</file>
thank you";
结果将是:
C:\Development\Projects 2010\Accounting\file20101130.csv
C:\Development\Projects 2010\Accounting\orders20101130.docx
C:\Development\Projects 2010\Accounting\customersupdated.xls
编辑:考虑到@Jim的内容,我编辑了字符串添加标签,以便更容易从字符串中提取所需的文件名!
这是我想出来的:
using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
string s = @"Hello John these are the files you have to send us today:
C:\projects\orders20101130.docx also we would like you to send
C:\some\file.txt, C:\someother.file and d:\some file\with spaces.ext
Thank you";
Extract(s);
}
private static readonly Regex rx = new Regex
(@"[a-z]:\\(?:[^\\:]+\\)*((?:[^:\\]+)\.\w+)", RegexOptions.IgnoreCase);
static void Extract(string text)
{
MatchCollection matches = rx.Matches(text);
foreach (Match match in matches)
{
Console.WriteLine("'{0}'", match.Value);
}
}
}
产生:(见ideone )
'C:\projects\orders20101130.docx', file: 'orders20101130.docx'
'C:\some\file.txt', file: 'file.txt'
'C:\someother.file', file: 'someother.file'
'd:\some file\with spaces.ext', file: 'with spaces.ext'
正则表达式不是非常强大(它确实做了一些假设)但它也适用于您的示例。
如果您使用<file>
标签,这是该程序的一个版本。 将正则表达式和Extract
更改为:
private static readonly Regex rx = new Regex
(@"<file>(.+?)</file>", RegexOptions.IgnoreCase);
static void Extract(string text)
{
MatchCollection matches = rx.Matches(text);
foreach (Match match in matches)
{
Console.WriteLine("'{0}'", match.Groups[1]);
}
}
如果您对文件名要求设置了一些限制,则可以使用与此类似的代码:
string s = @"Hello John
these are the files you have to send us today: C:\Development\Projects 2010\Accounting\file20101130.csv, C:\Development\Projects 2010\Accounting\orders20101130.docx
also we would like you to send C:\Development\Projects 2010\Accounting\customersupdated.xls
thank you";
Regex regexObj = new Regex(@"\b[a-z]:\\(?:[^<>:""/\\|?*\n\r\0-\37]+\\)*[^<>:""/\\|?*\n\r\0-\37]+\.[a-z0-9\.]{1,5}", RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);
MatchCollection fileNameMatchCollection = regexObj.Matches(s);
foreach (Match fileNameMatch in fileNameMatchCollection)
{
MessageBox.Show(fileNameMatch.Value);
}
在这种情况下,我将扩展名限制为1-5个字符。 您显然可以使用其他值或进一步限制文件扩展名中允许的字符。 有效字符列表取自MSDN文章命名文件,路径和命名空间 。
如果您使用<file>
标签,并且最终文本可以表示为格式良好的xml文档(就内部xml而言,即没有根标签的文本),您可能可以:
var doc = new XmlDocument();
doc.LoadXml(String.Concat("<root>", input, "</root>"));
var files = doc.SelectNodes("//file"):
要么
var doc = new XmlDocument();
doc.AppendChild(doc.CreateElement("root"));
doc.DocumentElement.InnerXml = input;
var nodes = doc.SelectNodes("//file");
这两种方法都很有效,并且是高度面向对象的,尤其是第二种方法。
并将带来更多的性能。
另请参阅 - 不要使用RegEx解析(X)HTML
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.