使用C#RegEx,我试图找到由两对不同的词组成的文本,比如start1 .... end1和start2 ... end2。在我下面的例子中,我想得到:text1,text2,text11,text22。
string str = "This start1 text1 end1. And start2 text2 end2 is a test. This start1 text11 end1. And start2 text22 end2 is a test.";
Regex oRegEx = new Regex(@"start1(.*?)end1|start2(.*?)end2", RegexOptions.IgnoreCase);
MatchCollection oMatches = oRegEx.Matches(sHTML);
if (oMatches.Count > 0)
{
foreach (Match mt in oMatches)
{
Console.WriteLine(mt.Value); //the display includes the start1 and end1 (or start2 and end2)
Console.WriteLine(mt.Groups[1].Value); //the display excludes the start1 and end1 (or start2 and end2) or displays an empty string depending on the order of pattern.
}
}
上面代码中的 mt.Groups[1].Value
正确显示text1,如果模式为@"start1(.*?)end1|start2(.*?)end2"
则为text11,但它显示text2和text22的空字符串。另一方面,如果我将模式中的顺序更改为@"start2(.*?)end2|start1(.*?)end1"
,它会正确显示text2,text22但显示text1和text11的空字符串。我的代码中需要更改什么?
这个MSDN article解释了一个组何时返回空字符串,但我仍然没有得到所需的结果。
答案 0 :(得分:2)
给团体命名。
start1(?<val>.*?)end1|start2(?<val>.*?)end2
获得价值:
mt.Groups["val"].Value
原始问题是,如果没有名称,则start1
和end1
之间的群组具有索引1
,start2
和end2
之间的群组具有索引{{ 1}},如下图所示:
或另一个解决方案是使用正则表达式:
2
然后在你的代码中:
(?<=start([12])).*?(?=end\1)
将显示所需内容。