我有如下的正则表达式模式:
Regex rx1 = new Regex(@"<div>/\*(.(?!\*/))*\*/(</div>|<br/></div>|<br></div>)");
Regex rx2 = new Regex(@"/\*[^>]+?\*/(<br/>|<br>)");
Regex rx3 = new Regex(@"/\*[^>]+?\*/");
任何人都可以帮助将正则表达式连接在一起成为一种模式吗?
您对 RX1 的问题是因为(.(?!\*/))*\*/
它会捕获任何字符零次或多次,只要它没有被跟随,*/
因此答案永远不会匹配。
更新答案
@"(?'div'<div>)?/\*((?<!\*/).)*?\*/(?:<br/?>)?(?'-div'</div>)?(?(div)(?!))"
这将捕获:
(?'div'<div>) 存储在捕获组 div 中的可选打开 div /\* 字符序列 /* ((<!\*/).)*? 零个或多个字符,非贪婪且每个字符都不是 前面是字符串 */ \*/ 字符序列 `*/` (?:<br/?>)? 可选 <br> 或 <br/> (?'-div'</div>)? 可选 </div> 从捕获组 `div` 中删除 (?(div)(?!)) 仅当捕获组 div 为空时匹配(即平衡 <div> </div>)
尝试以下操作(这是 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();
}
}
}
我认为你需要这个来组合模式:
(pattern1|pattern2|pattern3)
意味着pattern1 or pattern2 or pattern3