【问题标题】:How to get the a number out of a string - C# - Regex如何从字符串中获取数字 - C# - 正则表达式
【发布时间】:2014-05-19 02:43:37
【问题描述】:

好的,这是我的问题:

<div class="anime_info"><div class='ctdn'>Ep 7 - <span class="cd_day">3</span>d <span class="cd_hr">10</span>h <span class="cd_min">30</span>m </div>

如何使用正则表达式从字符串中取出 7。我尝试休耕:

System.Text.RegularExpressions.Regex.Matches(line,@"[^\d]")[0].Value
System.Text.RegularExpressions.Regex.Matches(line,@"\d")[0].Value
System.Text.RegularExpressions.Regex.Match (line, @">Ep (\d*)- <span").Groups [1].Value
System.Text.RegularExpressions.Regex.Match (line, @">Ep ([0-9]*)- <span").Groups [1].Value
System.Text.RegularExpressions.Regex.Match (line, @">Ep ([0-9])- <span").Groups [1].Value
System.Text.RegularExpressions.Regex.Match(line,@"\d").Value

全部失败。

请帮助并为我的英语不好感到抱歉。

【问题讨论】:

  • 你应该解析 HTML 而不是使用正则表达式。
  • @SverriM.Olsen 您可以使用 HTML Agility Pack 来获取元素,但仍然需要 RegEx 从文本中获取数字。
  • @SteveWellens 当然。但是在使用正则表达式之前缩小搜索空间是个好主意:解析 HTML,找到您需要的文本节点,然后使用 simple 正则表达式获取数字。在 HTML 上使用正则表达式很少是一个好主意。
  • @SverriM.Olsen “在 HTML 上使用正则表达式很少是个好主意”是的,这就是我建议使用 HTML Agility Pack 的原因。

标签: c# html regex


【解决方案1】:

这将找到一组具有前导和尾随空格且其间有数字的文本:

 (\d+) 

因为它是\d+,所以它会找到1 or more 数字。

Debuggex Demo

【讨论】:

    【解决方案2】:

    我会选择(?:Ep )(\d*) - 一个非捕获组“Ep”捕获后面的数字。

    Demo 1

    Demo 2

    【讨论】:

      【解决方案3】:

      使用以下代码应该可以工作 -

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.Text.RegularExpressions;
      
      namespace Test.Console
      {
          class Program
          {
              static void Main(string[] args)
              {
                  string reference = "<div class=\"anime_info\"><div class='ctdn'>Ep 7 - <span class=\"cd_day\">3</span>d <span class=\"cd_hr\">10</span>h <span class=\"cd_min\">30</span>m </div>";
      
                  var regex = "[>]Ep(\\s+)(\\d+)(\\s+)\\-(\\s+)[<]";
                  var regex2 = "(\\d+)";
                  foreach (var m in Regex.Matches(reference, regex))
                  {
                      System.Console.WriteLine(m.ToString());
                      var m2 = Regex.Match(m.ToString(), regex2);
                      System.Console.WriteLine(m2.ToString());
                  }
                  System.Console.Read();
              }
          }
      }
      

      它打印以下内容,所以它正在工作 -

      >Ep 7 - <
      7
      
      1. 第一个regex用于隔离包含7的部分
      2. 第二个regex2用于隔离7内部regex
      3. 为了安全,我没有使用简单的空格,而是使用了\\s+,所以如果有更多的空格,它不会失败。
      4. 顺便说一句,- 是正则表达式中的关键字符,因此如果您在字符串中匹配 -,则应使用 \-

      【讨论】:

        【解决方案4】:

        从您的正则表达式中,您似乎知道“Ep”将始终存在,数字后跟一个空格。一种选择是将您的字符串分成几个子字符串。

        string input = "<div class='anime_info'><div class='ctdn'>Ep 7 - <span class='cd_day'>3</span>d <span class='cd_hr'>10</span>h <span class='cd_min'>30</span>m </div>";
        
        //grab a substring starting after "Ep "
        string next = input.Substring(input.IndexOf("Ep ") + 3);
        
        //grab the start of the new string until the first space
        string final = next.Substring(0, next.IndexOf(" "));
        

        如果你想概括这一点,你可以使用类似的函数来实现

        string stringBetween (string input, string start, string stop)
        {
            //grab a substring starting after start
            string output = input.Substring(input.IndexOf(start) + start.Length);
            //grab the start of the new string until the first instance of stop
            output = output.Substring(0, output.IndexOf(stop));
            return output;
        }
        

        然后你就打电话

        stringBetween(input, "Ep ", " ");
        

        这还假设您知道start 的第一个实例后面是您想要的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-09
          • 1970-01-01
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 2013-07-31
          • 1970-01-01
          • 2018-06-18
          相关资源
          最近更新 更多