0

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

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

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

4

3 回答 3

1

您对 RX1 的问题是因为(.(?!\*/))*\*/它会捕获任何字符零次或多次,只要它没有被跟随,*/因此答案永远不会匹配。

更新答案

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

这将捕获:

(?'div'<div>) 存储在捕获组 div 中的可选打开 div
 /\* 字符序列 /*
 ((<!\*/).)*? 零个或多个字符,非贪婪且每个字符都不是
                  前面是字符串 */
 \*/ 字符序列 `*/`
 (?:<br/?>)? 可选 <br> 或 <br/>
 (?'-div'</div>)? 可选 </div> 从捕获组 `div` 中删除
 (?(div)(?!)) 仅当捕获组 div 为空时匹配(即平衡 <div> </div>)
于 2013-10-24T08:12:51.037 回答
0

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

代码:

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();
    }
}

}

于 2013-10-24T19:43:11.390 回答
0

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

于 2013-10-24T07:47:47.473 回答