首页 文章

正则表达式匹配从最后

提问于
浏览
3

start123start123

start123endstart345end

start567endstart789end

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

我的代码:

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

唯一提取的文本将是 789

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

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

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

Update:

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

提取的文本将是 123start123\r\nstart123345567789

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

Update 2:

我的预期输出是 123345567789

3 回答

  • 3

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

    start(.*?)end
    

    编辑

    如果我正确理解您的问题,您可以使用 Negative Lookahead . (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);
    

    Output

    123
    345
    567
    789
    
  • 2

    如果你只需要得到开头和结尾之间的数字,不包括单词start&end ofcourse:

    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
    
  • 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

    Explanation:

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

    • \d+(?=end) 匹配一个或多个数字,后跟字符串 end

相关问题