返回顶部

收藏

将 LINQ 查询与正则表达式合并在一起

更多

使用 Regex 类创建正则表达式以便在文本字符串中进行更复杂的匹配。

[C#]代码

using System.IO;
using System.Text;
class QueryWithRegEx
{
    public static void Main()
    {
        // Modify this path as necessary so that it accesses your version of Visual Studio.
        string startFolder = @"c:\program files\Microsoft Visual Studio 9.0\";
        // One of the following paths may be more appropriate on your computer.
        //string startFolder = @"c:\program files (x86)\Microsoft Visual Studio 9.0\";
        //string startFolder = @"c:\program files\Microsoft Visual Studio 10.0\";
        //string startFolder = @"c:\program files (x86)\Microsoft Visual Studio 10.0\";

        // Take a snapshot of the file system.
        IEnumerable<FileInfo> fileList = GetFiles(startFolder);

        // Create the regular expression to find all things "Visual".
        RegularExpressions.Regex searchTerm =
            new RegularExpressions.Regex(@"Visual (Basic|C#|C\+\+|J#|SourceSafe|Studio)");

        // Search the contents of each .htm file.
        // Remove the where clause to find even more matchedValues!
        // This query produces a list of files where a match
        // was found, and a list of the matchedValues in that file.
        // Note: Explicit typing of "Match" in select clause.
        // This is required because MatchCollection is not a 
        // generic IEnumerable collection.
        var queryMatchingFiles =
            from file in fileList
            where file.Extension == ".htm"
            let fileText = File.ReadAllText(file.FullName)
            let matches = searchTerm.Matches(fileText)
            where matches.Count > 0
            select new
            {
                name = file.FullName,
                matchedValues = from RegularExpressions.Match match in matches
                                select match.Value
            };

        // Execute the query.
        Console.WriteLine("The term \"{0}\" was found in:", searchTerm.ToString());

        foreach (var v in queryMatchingFiles)
        {
            // Trim the path a bit, then write 
            // the file name in which a match was found.
            string s = v.name.Substring(startFolder.Length - 1);
            Console.WriteLine(s);

            // For this file, write out all the matching strings
            foreach (var v2 in v.matchedValues)
            {
                Console.WriteLine("  " + v2);
            }
        }

        // Keep the console window open in debug mode
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

    // This method assumes that the application has discovery 
    // permissions for all folders under the specified path.
    static IEnumerable<System.IO.FileInfo> GetFiles(string path)
    {
        if (!System.IO.Directory.Exists(path))
            throw new DirectoryNotFoundException();

        string[] fileNames = null;
        List<FileInfo> files = new List<FileInfo>();

        fileNames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
        foreach (string name in fileNames)
        {
            files.Add(new FileInfo(name));
        }
        return files;
    }
}

标签:C#

收藏

0人收藏

支持

0

反对

0

发表评论