正则表达式匹配从最后

时间:2014-07-15 00:18:16

标签: c# regex

start123start123

start123endstart345end

start567endstart789end

我需要在上面的字符串的所有开头和结尾之间提取一些数据集(粗体)。

我的代码:

Regex re = new Regex(start(.*)end, RegexOptions.Singleline);
foreach (Match m in re.Matches(text)) dosomething();

唯一提取的文字是 789

问题是我不知道需要提取的开始和结束格式化文本的确切数量。我希望我的正则表达式能够忽略开始前两个开始但贪婪的正则表达式忽略所有开始直到最后一个。

可以在匹配第一个结束文本后停止吗?

如果没有,是否有选项可以匹配后面的文字?

更新

实际上,我的原始代码使用的是非贪婪的正则表达式。

提取的文字将为 123start123 \ r \ n \ n \ nstart123 345 567 789

新行参数RegexOptions.Singleline在我的实际案例中是必要的,我在这里简化案例,让每个人都能轻松理解

更新2:

我的预期输出 123 345 567 789

3 个答案:

答案 0 :(得分:3)

*贪心运算符。因此,.*会尽可能多地匹配并仍然允许正则表达式的其余部分匹配。要获得non-greedy匹配,请使用*?

start(.*?)end

修改

如果我正确理解您的问题,您可以使用否定前瞻。 (Explanation

String s = @"start123start123
start123endstart345end
start567endstart789end";

Regex re = new Regex(@"(?s)start((?:(?!start).)*)end");

foreach (Match m in re.Matches(s))
         Console.WriteLine(m.Groups[1].Value);

<强>输出

123
345
567
789

答案 1 :(得分:2)

如果您只需要获取开头和结尾之间的数字,不包括单词start&amp;结束时:

Regex reg = new Regex(@"(?<=start)[0-9]*(?=end)");
string test = "start123endstart345end";
var resultings = reg.Matches(test);

在你展示的字符串中会得到{1,2,3} {3,4,5} {5,6,7} {7,8,9}:

start123endstart345end

start567endstart789end

答案 2 :(得分:1)

C#代码只获取起始字符串和结束字符串之间的数字,

{
String input = @"start123start123
start123endstart345end
start567endstart789end";
Regex rgx = new Regex(@"(?<=start)\d+(?=end)");
foreach (Match m in rgx.Matches(input))
Console.WriteLine(m.Value);
}

DEMO

IDEONE

<强>解释

  • (?<=start)\d+ Lookbehind用于查看与模式匹配的特定字符串。在我们的例子中,它看起来就在字符串start
  • 之后
  • \d+(?=end)匹配一个或多个数字,后跟字符串end