C# 只匹配一个组的正则表达式
我有一个非常古老的(奇怪的分隔符)字符串,它表示一个表,我想将所有文本放在两个“标记”之间(它们是一个令人讨厌的东西……它们在这里非常出色):C# 只匹配一个组的正则表达式,c#,regex,delimited-text,C#,Regex,Delimited Text,我有一个非常古老的(奇怪的分隔符)字符串,它表示一个表,我想将所有文本放在两个“标记”之间(它们是一个令人讨厌的东西……它们在这里非常出色): |||评论\u FOLLOW\u UP=\\myserver\Reporter\testu\20140611.rtf||| |||COMMENTS\u APPOINTMENT\u LIST=\\myserver\Reporter\testu\COMMENTS\u APPOINTMENT\u LIST\u 20140611.rtf||| 开始每月细分~~
|||评论\u FOLLOW\u UP=\\myserver\Reporter\testu\20140611.rtf|||
|||COMMENTS\u APPOINTMENT\u LIST=\\myserver\Reporter\testu\COMMENTS\u APPOINTMENT\u LIST\u 20140611.rtf|||
开始每月细分~~~
###行开始###
###行端###
###行开始###
###行端###
###行开始###
###行端###
###行开始###
###行端###
###行开始###
###行端###
月底分类~~~
开始活动~~~
###行开始###
您可以使用:
或者,您可以获得一个匹配,然后获得下一个匹配,等等:
var m = Regex.Match(input_string, regex);
while (m.Success)
{
// do something with this match
// then get the next match
m = m.NextMatch();
}
您可以使用:
或者,您可以获得一个匹配,然后获得下一个匹配,等等:
var m = Regex.Match(input_string, regex);
while (m.Success)
{
// do something with this match
// then get the next match
m = m.NextMatch();
}
首先,我建议您将正则表达式更改为:
(?s)~~~ START ([^~]*).*?END \1 ~~~
在开场白和START
之后,([^~]*)
捕获块的标题。这确保了我们可以确保END
稍后匹配
懒惰的*?
匹配到
标题(后面由\
引用)和结束波浪号
示例代码
这是一个完整的程序,你可以用它来测试。我还没试过。您需要将字符串粘贴到其中
using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program {
static void Main() {
string s1 = @"PASTE YOUR STRING HERE";
var myRegex = new Regex(@"(?s)~~~ START ([^~]*).*?END \1 ~~~");
MatchCollection AllMatches = myRegex.Matches(s1);
Console.WriteLine("\n" + "*** Matches ***");
if (AllMatches.Count > 0) {
foreach (Match SomeMatch in AllMatches) {
Console.WriteLine("Title: " + SomeMatch.Groups[1].Value);
Console.WriteLine("Overall Match: " + SomeMatch.Value);
}
}
Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();
} // END Main
} // END Program
首先,我建议您将正则表达式更改为:
(?s)~~~ START ([^~]*).*?END \1 ~~~
在开场白和START
之后,([^~]*)
捕获块的标题。这确保了我们可以确保END
稍后匹配
懒惰的*?
匹配到
标题(后面由\
引用)和结束波浪号
示例代码
这是一个完整的程序,你可以用它来测试。我还没试过。您需要将字符串粘贴到其中
using System;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
class Program {
static void Main() {
string s1 = @"PASTE YOUR STRING HERE";
var myRegex = new Regex(@"(?s)~~~ START ([^~]*).*?END \1 ~~~");
MatchCollection AllMatches = myRegex.Matches(s1);
Console.WriteLine("\n" + "*** Matches ***");
if (AllMatches.Count > 0) {
foreach (Match SomeMatch in AllMatches) {
Console.WriteLine("Title: " + SomeMatch.Groups[1].Value);
Console.WriteLine("Overall Match: " + SomeMatch.Value);
}
}
Console.WriteLine("\nPress Any Key to Exit.");
Console.ReadKey();
} // END Main
} // END Program
您需要在循环中多次调用正则表达式匹配器,直到没有匹配为止。考虑修改表达式以避免回溯——在这种情况下,这是非常可能的,因为<代码> .+/COD>是贪婪的(与“不情愿的”相反)。
下面是一个小演示,演示了如何执行此操作:
var regex = new Regex("~~~ START ([^~]+)~~~([^~]*)~~~ END ([^~]+)~~~", RegexOptions.Multiline);
var m = regex.Match(Data);
while (m.Success) {
Console.WriteLine("------ Start: {0} --------", m.Groups[1]);
Console.WriteLine(m.Groups[2]);
Console.WriteLine("------ End: {0} --------", m.Groups[3]);
m = m.NextMatch();
}
注意上面的更改-我用[^~]
替换了
,以匹配第一个Swiggly,并且我还捕获了开始和结束标记的内容以进行打印。您需要在循环中多次调用正则表达式匹配器,直到没有匹配为止。考虑修改表达式以避免回溯——在这种情况下,这是非常可能的,因为<代码> .+/COD>是贪婪的(与“不情愿的”相反)。
下面是一个小演示,演示了如何执行此操作:
var regex = new Regex("~~~ START ([^~]+)~~~([^~]*)~~~ END ([^~]+)~~~", RegexOptions.Multiline);
var m = regex.Match(Data);
while (m.Success) {
Console.WriteLine("------ Start: {0} --------", m.Groups[1]);
Console.WriteLine(m.Groups[2]);
Console.WriteLine("------ End: {0} --------", m.Groups[3]);
m = m.NextMatch();
}
注意上面的更改-我将
替换为[^~]
以匹配第一个squiggly,并且我还捕获了开始和结束标记的内容以进行打印。我认为您必须使用全局标志。包括实际代码;我想可能有用。我想你必须使用全局标志。包括实际代码;我想可能有用。真不敢相信我从未使用过匹配项。每次复数都会让我得到+1,并被接受,因为你提供了另一个感谢Jim。我不敢相信我从未使用过匹配项。每次复数都会得到我,+1并被接受,因为你提供了一个备用的感谢Jim。这是一个很好的解决方案+1对,*?
是*
的非贪婪版本。它使正则表达式执行器的工作更加困难,但有必要防止*
耗尽所有结束
文本。@leemo您确实需要更改正则表达式以使任何解决方案工作,这就是为什么此答案提供了一个正确的正则表达式。您的原始正则表达式~~~~开始、+~~(.*)~~~~结束、+~~~
不起作用。这是一个很好的解决方案+1正确,*?
是*
的非贪婪版本。它使正则表达式执行器的工作更加困难,但有必要防止*
耗尽所有结束
文本。@leemo您确实需要更改正则表达式以使任何解决方案工作,这就是为什么此答案提供了一个正确的正则表达式。您原来的正则表达式~~~~开始、+~~(.*)~~~~~结束、+~~~~
不起作用。匹配第一个波浪形是一种比我贪婪的方法更好的方法。。。更新,谢谢。我希望我能接受所有的答案。非常感谢大家的时间。匹配第一块瓷砖比我贪婪的方式更好。。。更新,谢谢。我希望我能接受所有的答案。非常感谢大家的时间。