正则表达式模式不正确和组合

本文关键字:组合 不正确 模式 正则表达式 | 更新日期: 2023-09-27 18:36:44

我有如下所示的正则表达式模式:

Regex rx1 = new Regex(@"<div>/'*(.(?!'*/))*'*/(</div>|<br/></div>|<br></div>)");
Regex rx2 = new Regex(@"/'*[^>]+?'*/(<br/>|<br>)");
Regex rx3 = new Regex(@"/'*[^>]+?'*/");

任何人都可以帮助将正则表达式连接在一起成为 1 模式吗?

正则表达式模式不正确和组合

您使用 RX1 的问题是因为 (.(?!'*/))*'*/ 捕获任何字符零次或多次,只要它后面没有*/因此答案永远无法匹配。

更新的答案

@"(?'div'<div>)?/'*((?<!'*/).)*?'*/(?:<br/?>)?(?'-div'</div>)?(?(div)(?!))"

这将捕获:

 (?'div'
) 存储在捕获组div 中的可选打开div/''* 字符序列/* (()? 可选

(?'-div'
)?(可选)
从捕获组"div"中删除 (?(分)(?!)) 仅当捕获组div 为空时才匹配(即平衡

我认为你需要这个来组合模式: (pattern1|pattern2|pattern3)意味着pattern1 or pattern2 or pattern3

尝试以下操作(这是弗兰肯斯坦代码,但它可以帮助您管理每个正则表达式变量,因为它是自己的,而不是将所有三个变量连接成一个大的正则表达式(虽然它没有错,但管理对正则表达式的更改可能很困难)。

法典:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace BatchRegex
{
    class Program
   {
      static void Main(string[] args)
    {
        string[] target = 
    {
            "<div>/*...*/</div> <div>/*...*/<br></div> <div>/*...*/<br></div>",
            "/*...*/<br></div> or /*...*/<br/></div>"
    };


        foreach (var tgt in target)
        {
           var rx1 = new Regex[]{new Regex(@"<div>/'*(.(?!'*/))*'*/(</div>|<br/></div>|<br></div>)", RegexOptions.Multiline),
            new Regex(@"/'*[^>]+?'*/(<br/>|<br>)", RegexOptions.Multiline),
            new Regex(@"/'*[^>]+?'*/", RegexOptions.Multiline)};

            foreach (var rgx in rx1)
            {
                var rgxMatches = rgx.Matches(tgt).Cast<Match>();
                Parallel.ForEach(rgxMatches, match =>
                    {
                        Console.WriteLine("Found {0} in target {1}.", match, tgt);
                    });
            }
        }
        Console.Write("Press any key to exit...");
        Console.ReadKey();
    }
}

}