21

我想在 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);

我究竟做错了什么?

4

6 回答 6

52

您要求 0 个或更多数字。您需要要求 1 个或多个:

"\\d+"
于 2008-12-16T18:08:23.547 回答
3

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

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

要从字符串中获取 byte、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+))?
于 2010-09-10T21:23:20.233 回答
0

这是我用泛型为 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+");

希望这对某人有用...

于 2009-10-22T20:08:14.610 回答
0

除了 PiPeep 所说的之外,如果您尝试匹配表达式中的整数,那么它1 + 2 - 3只会匹配1, 2, and 3, 而不是1, + 2and - 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

于 2012-12-20T19:11:16.770 回答
0

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]*");
于 2016-09-02T19:24:54.717 回答
0

使用其中之一:

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

或者

Pattern intsOnly = Pattern.compile("\\d+");
于 2018-12-26T14:53:20.497 回答