【问题标题】:Regex to get first number in string with other characters正则表达式获取字符串中的第一个数字和其他字符
【发布时间】:2020-05-14 16:46:57
【问题描述】:

我是正则表达式的新手,想知道如何才能只获得像100 2011-10-20 14:28:55 这样的字符串中的第一个数字。在这种情况下,我希望它返回100,但这个数字也可以更短或更长。

我在考虑类似 [0-9]+ 的东西,但它需要单独的每个数字 (100,2001,10,...)

谢谢。

【问题讨论】:

  • 你知道字符串总是以数字开头还是你想要任何字符串的第一个数字?如果是前者,这不是正则表达式的好用
  • 我知道字符串总是以数字开头。它总是遵循我给出的模式。 (生效日期时间)
  • 为什么不直接找第一个空格呢?

标签: java regex


【解决方案1】:
/^[^\d]*(\d+)/

这将从头开始,跳过任何非数字,并匹配它找到的第一个数字序列

编辑: 此正则表达式将匹配第一组数字,但是,正如其他答案中所指出的,如果您知道数字位于字符串的开头,则 parseInt 是一个更好的解决方案

【讨论】:

  • 这个正则表达式为我工作(regExr 和 Python)匹配第一个数字,不管前面是什么:/[^\d]*(\d+)/
【解决方案2】:

只是

([0-9]+) .* 

如果你总是在第一个数字之后有空格,这将起作用

【讨论】:

    【解决方案3】:

    试试这个来匹配字符串中的第一个数字(不能在字符串的开头):

        String s = "2011-10-20 525 14:28:55 10";
        Pattern p = Pattern.compile("(^|\\s)([0-9]+)($|\\s)");
        Matcher m = p.matcher(s);
        if (m.find()) {
            System.out.println(m.group(2));
        }
    

    【讨论】:

      【解决方案4】:

      假设前两个数字之间总是有一个空格,那么

      preg_match('/^(\d+)/', $number_string, $matches);
      $number = $matches[1]; // 100
      

      但是对于这样的事情,你最好使用简单的字符串操作:

      $space_pos = strpos($number_string, ' ');
      $number = substr($number_string, 0, $space_pos);
      

      正则表达式计算量大,应尽可能避免使用。

      【讨论】:

      • 这个 Java 语法对我来说很奇怪。请为我提供 Java 文档的链接。
      【解决方案5】:

      下面的代码可以解决问题。

      Integer num = Integer.parseInt("100 2011-10-20 14:28:55");
      

      【讨论】:

      • 如果字符串 always 以数字开头,则 +1 挂起...也是Integer.parseInt() :)
      • 这是一个更直接的解决方案,基于用户确认字符串始终以所需数字​​开头。对于家里的孩子,不需要正则表达式。将此代码与答案进行比较,nuff 说。
      • NumberFormatException 在这种情况下被抛出。
      • 这是错误的答案,它会像 Vic 所说的那样抛出 NumberFormatException。
      【解决方案6】:

      即使字符串不以数字开头,此字符串扩展也能完美运行。 在每种情况下返回 1234 - "1234asdfwewf", "%sdfsr1234" "## # 1234"

          public static string GetFirstNumber(this string source)
          {
              if (string.IsNullOrEmpty(source) == false)
              {
                  // take non digits from string start
                  string notNumber = new string(source.TakeWhile(c => Char.IsDigit(c) == false).ToArray());
      
                  if (string.IsNullOrEmpty(notNumber) == false)
                  {
                      //replace non digit chars from string start
                      source = source.Replace(notNumber, string.Empty);
                  }
      
                  //take digits from string start
                  source = new string(source.TakeWhile(char.IsDigit).ToArray());
              }
              return source;
          }
      

      【讨论】:

        【解决方案7】:

        [0-9] 表示数字 0-9 可以使用 + 表示 1 次或多次。如果你使用 [0-9]{3} 会得到 3 个数字

        【讨论】:

          【解决方案8】:

          尝试^(?'num'[0-9]+).*$,它强制它从头开始,读取一个数字,将其存储到“num”,然后在没有绑定的情况下使用剩余部分。

          【讨论】:

            【解决方案9】:

            注意:在 Java 中,当您将模式定义为字符串文字时,不要忘记使用双反斜杠来定义正则表达式转义反斜杠 (\. = "\\.")。

            要获取出现在字符串开头或开头的数字,您可以考虑使用

            ^[0-9]*\.?[0-9]+       # Float or integer, leading digit may be missing (e.g, .35)
            ^-?[0-9]*\.?[0-9]+     # Optional - before number (e.g. -.55, -100)
            ^[-+]?[0-9]*\.?[0-9]+  # Optional + or - before number (e.g. -3.5, +30)
            

            this regex demo

            如果您还想在字符串开头匹配带有科学记数法的数字,请使用

            ^[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?        # Just number
            ^-?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?      # Number with an optional -
            ^[-+]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?   # Number with an optional - or  +
            

            this regex demo

            要确保右侧没有其他数字,请添加\b 字边界或(?!\d)(?!\.?\d) 否定前瞻,如果右侧有任何数字(或 . 和数字),则匹配失败。

            【讨论】:

              【解决方案10】:
              public static void main(String []args){
                      Scanner s=new Scanner(System.in);
                      String str=s.nextLine();
                      Pattern p=Pattern.compile("[0-9]+");
                      Matcher m=p.matcher(str);
                      while(m.find()){
                          System.out.println(m.group()+" ");
              
                      }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-01-02
                • 2015-10-28
                • 1970-01-01
                • 2016-02-14
                • 1970-01-01
                • 2015-10-04
                相关资源
                最近更新 更多