start123start123
start123endstart345end
start567endstart789end
我需要在上面的字符串的所有开头和结尾之间提取一些数据集(粗体) .
我的代码:
Regex re = new Regex(start(.*)end, RegexOptions.Singleline);
foreach (Match m in re.Matches(text)) dosomething();
唯一提取的文本将是 789
问题是我不知道需要提取的开始和结束格式化文本的确切数量 . 我希望我的正则表达式能够忽略开始前两个开始,但贪婪的正则表达式忽略所有开始,直到最后一个 .
可以在匹配第一个结束文本后停止吗?
如果没有,是否有选项可以匹配后面的文字?
Update:
实际上,我原来的代码是使用非贪婪的正则表达式 .
提取的文本将是 123start123\r\nstart123 , 345 , 567 , 789
新行参数RegexOptions.Singleline在我的实际案例中是必要的,我在这里简化案例,让每个人都能轻松理解
Update 2:
我的预期输出是 123 , 345 , 567 , 789
3 回答
*
是 greedy 运算符 . 因此,.*
将尽可能匹配并仍然允许正则表达式的其余部分匹配 . 要获得non-greedy匹配,请使用*?
编辑
如果我正确理解您的问题,您可以使用 Negative Lookahead . (Explanation)
Output
如果你只需要得到开头和结尾之间的数字,不包括单词start&end ofcourse:
它会在你显示的字符串中得到{1,2,3} {3,4,5} {5,6,7} {7,8,9}:
C#代码只获取开始和结束字符串之间的数字,
DEMO
IDEONE
Explanation:
(?<=start)\d+
Lookbehind用于查看与模式匹配的特定字符串 . 在我们的例子中,它看起来就在字符串start
之后 .\d+(?=end)
匹配一个或多个数字,后跟字符串end