【问题标题】:Regex to find an integer within a string正则表达式在字符串中查找整数
【发布时间】:2008-12-16 18:05:47
【问题描述】:

我想在 Java 中使用正则表达式。

我要做的是找到字符串中的第一个整数。

例子:

String = "the 14 dogs ate 12 bones"

将返回 14。

String = "djakld;asjl14ajdka;sdj"

也会返回 14。

这是我目前所拥有的。

Pattern intsOnly = Pattern.compile("\\d*");
Matcher makeMatch = intsOnly.matcher("dadsad14 dssaf jfdkasl;fj");
makeMatch.find();
String inputInt = makeMatch.group();
System.out.println(inputInt);

我做错了什么?

【问题讨论】:

    标签: java regex integer


    【解决方案1】:

    您要求输入 0 位或更多位数。您需要要求 1 个或多个:

    "\\d+"
    

    【讨论】:

    • 如果你想找到相同的结果,但前面都带有负 - 和正 + 字符怎么办? IE。 +3 或 -5 或 8...
    【解决方案2】:

    看起来其他解决方案无法处理+/-2e3java.lang.Integer.parseInt(String) 支持的情况,所以我会解决这个问题。我对正则表达式有点缺乏经验,所以我可能犯了一些错误,使用了 Java 正则表达式解析器不支持的东西,或者使它过于复杂,但这些语句似乎在 Kiki 0.5.6 中有效。

    所有正则表达式都以非转义格式提供以供阅读,以及可在 Java 中用作字符串文字的转义格式。

    从字符串中获取字节、short、int 或 long:

    unescaped: ([\+-]?\d+)([eE][\+-]?\d+)?
      escaped: ([\\+-]?\\d+)([eE][\\+-]?\\d+)?
    

    ...以及奖励积分...

    从字符串中获取双精度或浮点数:

    unescaped: ([\+-]?\d(\.\d*)?|\.\d+)([eE][\+-]?(\d(\.\d*)?|\.\d+))?
      escaped: ([\\+-]?\\d(\\.\\d*)?|\\.\d+)([eE][\\+-]?(\\d(\\.\\d*)?|\\.\\d+))?
    

    【讨论】:

    • 这仍然捕获像 099 这样的数字,java parseInt 将在其上抛出 NumberFormatException。
    • 我一定是误会你了。 099Integer.parseInt()转换成99,见:pastie.org/1881188
    • 当数字在“2-1”之类的字符串中时这仍然有效吗?它会正确找到第一个匹配“2”,但第二个匹配“-1”不正确,因为 - 是一个运算符。您将需要使用更高级的东西(如果前面的东西也是数字,则涉及不包含 + 或 - 的后视)
    【解决方案3】:

    这是我用泛型为 C# 制作的一个方便的。它将根据您的正则表达式进行匹配并返回您需要的类型:

    public T[] GetMatches<T>(string Input, string MatchPattern) where T : IConvertible
        {
            List<T> MatchedValues = new List<T>();
            Regex MatchInt = new Regex(MatchPattern);
    
            MatchCollection Matches = MatchInt.Matches(Input);
            foreach (Match m in Matches)
                MatchedValues.Add((T)Convert.ChangeType(m.Value, typeof(T)));
    
            return MatchedValues.ToArray<T>();
        }
    

    如果你只想获取数字并将它们返回到 string[] 数组中:

    string Test = "22$data44abc";
    string[] Matches = this.GetMatches<string>(Test, "\\d+");
    

    希望这对某人有用...

    【讨论】:

      【解决方案4】:

      除了 PiPeep 所说的,如果你试图匹配表达式中的整数,那么 1 + 2 - 3 将只匹配 123,而不是 1、@987654327 @ 和- 3,你实际上需要使用lookbehind 语句,而你想要的部分实际上将由Matcher.group(2) 返回,而不仅仅是Matcher.group()

      unescaped: ([0-9])?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
        escaped: ([0-9])?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)
      

      另外,对于像someNumber - 3 这样的东西,someNumber 是一个变量名或类似的东西,你可以使用

      unescaped: (\w)?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
        escaped: (\\w)?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)
      

      当然,如果您要解析像 The net change to blahblah was +4 这样的字符串,那当然行不通

      【讨论】:

      • 我在这些正则表达式中看不到任何后视。我看到的是conditionals,Java 不支持。
      【解决方案5】:

      java 规范实际上给出了这个用于解析双精度的正则表达式怪物。 然而,这被认为是不好的做法,只是尝试使用预期的类型进行解析并捕获错误,往往更具可读性。

      DOUBLE_PATTERN = Pattern
              .compile("[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)"
                      + "([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|"
                      + "(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))"
                      + "[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
      

      【讨论】:

        【解决方案6】:

        使用其中之一:

        Pattern intsOnly = Pattern.compile("[0-9]+");
        

        Pattern intsOnly = Pattern.compile("\\d+");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-26
          相关资源
          最近更新 更多