C#Regex在两对不同的字符串之间找到字符串

时间:2014-05-04 21:31:50

标签: c# regex string string-search

使用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解释了一个组何时返回空字符串,但我仍然没有得到所需的结果。

1 个答案:

答案 0 :(得分:2)

给团体命名。

start1(?<val>.*?)end1|start2(?<val>.*?)end2

获得价值:

mt.Groups["val"].Value

原始问题是,如果没有名称,则start1end1之间的群组具有索引1start2end2之间的群组具有索引{{ 1}},如下图所示: Regular expression visualization

另一个解决方案是使用正则表达式:

2

Regular expression visualization

Debuggex Demo

然后在你的代码中:

(?<=start([12])).*?(?=end\1)

将显示所需内容。