.net 如何在正向前瞻(问号等于)中在整个模式上正确拆分正则表达式
我想对.net 如何在正向前瞻(问号等于)中在整个模式上正确拆分正则表达式,.net,regex,.net,Regex,我想对标记的所有实例进行拆分,该标记后跟一个相同大写字符的序列,后跟一个句点。例如A.和BB.会匹配,但A.、AB.、Aa.和C不会匹配。这是我的正则表达式(我正在使用.NET): (?=\s*([A-Z])\1*\) 问题在于,拆分列表是 A A. 当它应该是1的时候A.(我希望匹配的模式包含在拆分列表中,这是具有正向前瞻性的原因) 我认为这是由于([A-Z])周围有括号,这是使用\1创建捕获组以匹配同一字符所必需的。我正在使用来测试这一点。您实际上可以使用正则表达式来匹配字符串中的位置,并从
标记的所有实例进行拆分,该标记后跟一个相同大写字符的序列,后跟一个句点。例如A.
和BB.
会匹配,但A.
、AB.
、Aa.
和C
不会匹配。这是我的正则表达式(我正在使用.NET):
(?=\s*([A-Z])\1*\)
问题在于,拆分列表是
A
A.
我认为这是由于
([A-Z])
周围有括号,这是使用\1
创建捕获组以匹配同一字符所必需的。我正在使用来测试这一点。您实际上可以使用正则表达式来匹配字符串中的位置,并从以前找到的索引中附加子字符串:
var text = "<p>AI.For example <p>A.I<p>BB.";
var result = new List<string>();
var rx = new Regex(@"(?=<p>\s*([A-Z])\1*\.)"); // The zero-length matching regex used in Regex.Split
var idx = 0;
foreach (Match m in rx.Matches(text)) { // Iterate over all matches
result.Add(text.Substring(idx, m.Index-idx)); // Add item to resulting array
idx = m.Index;
}
if (idx < text.Length - 1) { // Add trailing text after last match if present
result.Add(text.Substring(idx));
}
请参阅。是,当捕获组出现在正则表达式中时,所有捕获都作为结果数组的一部分输出。是的,因此问题在于实际上有两种捕获在起作用:整个模式匹配将包含在拆分列表中,而单数字符则确保重复的是同一个字母。没有办法区分它们,只是将整个匹配项放在分裂列表中。我能想到的唯一一个regex我能想到的是
(《p=\s*(((::::)没有办法区分它们,没有办法区分它们,只有将整个匹配项放在分裂列表中。我能想到的唯一一个regex我能想到的regex是我能想到的唯一的regex是:(:)我能想到的唯一的是我能想到的。我能想到的唯一的regex我能想到的是我能想到的唯一的是:::<代码是:::>>>(((:::)我能想到的我能想到的是::::)我能想到的,s************((((::::::::::::::::::::::::((:::::::::当然,这是一个我喜欢的聪明的解决方案。不幸的是,我不得不使用一个共享基类,该基类使用了Regex.Split
,我无法修改您答案中的效果,但我将其标记为已接受,因为它应该可以正常工作。@Drew Well,我将这些方法共享为Regex.Split
捕获组的行为无法重新定义:(我尝试了一种匹配方法,但我遇到了一个bug(或“特性”),它涉及.NET正则表达式如何处理连续的零长度匹配。
<p>AI.For example
<p>A.I
<p>BB.
var text = "aaa<p>AI.For example <p>A.I<p>BB.b";
text = Regex.Replace(text, @"(?=<p>\s*([A-Z])\1*\.)", "\uFFFF");
var result = text.Split('\uFFFF');
Console.WriteLine(string.Join("\n", result)); // => [aaa<p>AI.For example, <p>A.I, <p>BB.b]