【问题标题】:Regex exclude ":" and a whitespace if they exist正则表达式排除“:”和空格(如果存在)
【发布时间】:2021-09-09 05:04:53
【问题描述】:

所以我在这里有一个正则表达式:

var text = new Regex(@"(?<=Paybacks).*", RegexOptions.IgnoreCase);

这会查找以 Paybacks 开头的行。现在它当前打印“:blah”。 上下文有时可以是“Paybacks”或“Paybacks:”或“Paybacks”,或者我不知道“Paybacks(带有数千个空格)。我怎样才能修改这个正则表达式就像......在“Paybacks”之后忽略冒号和一个可能存在也可能不存在的空格(或多个空格)。

我一直在 regex101 中使用它,这似乎有效,但有更好的方法吗?

(?<=Volatility(:\s)).*

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    在这些情况下,您最好使用带有捕获组的正则表达式:

    var pattern = new Regex(@"Paybacks[\s:]*(.*)", RegexOptions.IgnoreCase);
    

    然后,你可以使用

    var output = Regex.Match(text, pattern)?.Groups[1].Value;
    

    .NET regex demo

    C# demo

    var texts = new List<string> { "Paybacks: blah","Paybacks:blah","Paybacks blah"};
    var pattern = new Regex(@"Paybacks[\s:]*(.*)", RegexOptions.IgnoreCase);
    texts.ForEach(text => Console.WriteLine(pattern.Match(text)?.Groups[1].Value));
    

    打印 3 blahs.

    【讨论】:

      【解决方案2】:

      您还可以在后视中匹配可选的冒号和空白字符,并开始匹配除 : 以外的任何非空白字符的第一个字符

      (?<=Paybacks[:\s]*)[^\s:].*
      

      模式匹配:

      • (?&lt;= 正面向后看,断言左边是
        • Paybacks 字面匹配
        • [:\s]* 可以选择匹配 : 或使用字符类的空白字符
      • ) 近距离观察
      • [^\s:].* 匹配除: 以外的单个非空白字符和该行的其余部分

      Regex demo | C# demo

      var regex = new Regex(@"(?<=Paybacks[:\s]*)[^\s:].*", RegexOptions.IgnoreCase);
      string[] strings = {"Paybacks: blah", "Paybacks blah", "Paybacks                  blah"};
      
      foreach (String s in strings)
      {
          Console.WriteLine(regex.Match(s)?.Value);
      }
      

      输出

      blah
      blah
      blah
      

      如果顺序应该是一个可选的冒号和可选的空白字符,您可以使用:?\s*将冒号和空白字符的量词设为0或更多

      (?<=Paybacks:?\s*)[^\s:].*
      

      Regex demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 2014-06-04
        • 2016-06-17
        • 1970-01-01
        相关资源
        最近更新 更多