简体   繁体   中英

Can LINQ be used to search for Regex expressions in a string?

I have the following code that works, but would like to edit it up using LINQ to find if any of the Regex search strings are in the target.

foreach (Paragraph comment in
            wordDoc.MainDocumentPart.Document.Body.Descendants<Paragraph>().Where<Paragraph>(comment => comment.InnerText.Contains("cmt")))
{
    //print values
}

More precisely I have to select through LINQ if the string start with letters or start with symbols - or

This Regex is correct for my case ?

string pattern = @"^[a-zA-Z-]+$";
Regex rg = new Regex(pattern);

Any suggestion please?

Thanks in advance for any help

You can. It would be better to use query syntax though, as described here: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/how-to-combine-linq-queries-with-regular-expressions

Example:

var queryMatchingFiles =  
            from file in fileList  
            where file.Extension == ".htm"  
            let fileText = System.IO.File.ReadAllText(file.FullName)  
            let matches = searchTerm.Matches(fileText)  
            where matches.Count > 0  
            select new  
            {  
                name = file.FullName,  
                matchedValues = from System.Text.RegularExpressions.Match match in matches  
                                select match.Value  
            };  

Your pattern is fine, just remove the $ from the end and add any character

 @"^[a-zA-Z-]+. *"

Your regex should be modified as

^[\p{L}•-]

To also allow whitespace at the start of the string add \\s and use

^[\p{L}\s•-]

Details

  • ^ - start of string
  • [\\p{L}•-] - a letter, or -
  • [\\p{L}•-] - a letter, whitespace, or -

In C#, use

var reg = new Regex(@"^[\p{L}•-]");
foreach (Paragraph comment in
    wordDoc.MainDocumentPart.Document.Body.Descendants<Paragraph>()
       .Where<Paragraph>(comment => reg.IsMatch(comment.InnerText)))
{
    //print values
}

If you want to match those items containing cmt and also matching this regex, you may adjust the pattern to

var reg = new Regex(@"^(?=.*cmt)[\p{L}\s•-]", RegexOptions.Singleline);

If you need to only allow cmt at the start of the string:

var reg = new Regex(@"^(?:cmt|[\p{L}\s•-])");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM