正则表达式模式不正确和组合
本文关键字:组合 不正确 模式 正则表达式 | 更新日期: 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'
我认为你需要这个来组合模式: (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();
}
}
}