【问题标题】:Regex string for phrase短语的正则表达式字符串
【发布时间】:2013-07-10 01:59:46
【问题描述】:

我正在尝试提取带有短语“Ticket ID:(20 位数字)”的票号 这句话可以写成:

  • “票证ID:(20位数字)”
  • "TicketID:(20 位数字)" - 空格无关紧要

这是我正在使用但无法正常工作的正则表达式字符串。我试图了解我在这里做错了什么。这个正则表达式应该寻找任何没有空格的短语,其中包含单词 Ticket 后跟 ID: 后跟任何类型的 20 位数字。

Regex newExpression = new Regex(@"\bTicket\b.*\bID:\b.*\d{20}", 
                RegexOptions.IgnoreCase 
                | RegexOptions.Singleline
                | RegexOptions.IgnorePatternWhitespace);

【问题讨论】:

  • 那么你的正则表达式有什么问题呢?是不匹配,还是需要知道怎么组团,还是……?
  • 它与我上面提到的短语不匹配。当使用短语“testestetaette Ticket ID: (20 digit Number) dwadwdwdwfwfw”时找不到它。

标签: c# regex


【解决方案1】:

使用此模式,您可以直接获得数字,因为后向 (?<=..) 只是一个检查,不在匹配结果中:

Regex newExpression = new Regex(@"(?<=\bTicket\s*ID\s*:\s*)\d{20}", 
            RegexOptions.IgnoreCase);

【讨论】:

    【解决方案2】:

    : 之后不会出现单词边界。只需使用\s* 忽略空格:

    Regex newExpression = new Regex(@"Ticket\s*ID:\s*(\d{20})");
    

    现在您可以使用newExpression.Match(someString).Groups[1].Value

    【讨论】:

      【解决方案3】:

      跳过::之前的所有内容,比如

      @".*\s*\d{20}"
      

      【讨论】:

      • 任意数量的任何东西,后跟任意数量的空格,后跟二十位数字?为什么不只是 20 位数字?
      【解决方案4】:

      好吧,你可以试试这段代码。它在Regex 中将 20 位数字捕获为 named 捕获组:

      var newExpression = new Regex(//@"\bTicket\b.*\bID:\b.*\d{20}", 
                      @"Ticket\s*ID\:\s*(?<num>\(\d{20}\))",
                      RegexOptions.IgnoreCase 
                      | RegexOptions.Singleline
                      | RegexOptions.IgnorePatternWhitespace);
      
      var items=new List<string>();
      var r=new Random();
      var sb=new StringBuilder();
      var i=0;
      var formats=new []{"TicketID:({0})", "Ticket ID:({0})", "Ticket ID: ({0})", 
                     "Ticket ID: ({0})"};
      for(;i<5;i++){
          for(var j=0;j<20;j++){
              sb.Append(r.Next(0,9));
          }
          items.Add(string.Format(formats[r.Next(0,4)],sb));
          sb.Remove(0,20);
      }
      
      for(;i<10;i++){
          for(var j=0;j<20;j++){
              sb.Append(r.Next(0,9));
          }
          items.Add(string.Format(formats[r.Next(0,2)],sb));
          sb.Remove(0,20);
      }
      
      for(;i<15;i++){
          for(var j=0;j<20;j++){
              sb.Append(r.Next(0,9));
          }
          items.Add(string.Format(formats[r.Next(0,2)],sb));
          sb.Remove(0,20);
      }
      
      foreach(var s in items){
          var m = newExpression.Match(s);
          if(m.Success && m.Groups!=null && m.Groups.Count>0){
              string.Format("{0} - {1}",s,m.Groups["num"].Value).Dump();
          }
      }
      

      注意:这是在 Linqpad 中运行的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-06-15
        • 2016-07-01
        • 1970-01-01
        • 2014-03-02
        • 2021-05-31
        • 1970-01-01
        • 2021-09-18
        • 2014-11-01
        相关资源
        最近更新 更多