正则表达式在字符串中查找整数

时间:2008-12-16 18:05:48

标签: java regex integer

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

我做错了什么?

6 个答案:

答案 0 :(得分:50)

您要求的是0位或更多位数。你需要要求1个或更多:

"\\d+"

答案 1 :(得分:3)

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

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

从字符串中获取byte,short,int或long:

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

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

从字符串中获取double或float:

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

答案 2 :(得分: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 Test = "22$data44abc";
string[] Matches = this.GetMatches<string>(Test, "\\d+");

希望这对某人有用......

答案 3 :(得分:0)

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

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+)?)

这样的字符串,当然不会起作用

答案 4 :(得分: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]*");

答案 5 :(得分:0)

使用其中之一:

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

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