Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式来查找字符串中的整数_Java_Regex_Integer - Fatal编程技术网

Java 正则表达式来查找字符串中的整数

Java 正则表达式来查找字符串中的整数,java,regex,integer,Java,Regex,Integer,我想将正则表达式与Java一起使用 我要做的是找到字符串中的第一个整数 例如: String = "the 14 dogs ate 12 bones" 他14岁就回来了 String = "djakld;asjl14ajdka;sdj" 也将返回14 String = "djakld;asjl14ajdka;sdj" 这就是我目前所拥有的 Pattern intsOnly = Pattern.compile("\\d*"); Matcher makeMatch = intsOnly.mat

我想将正则表达式与Java一起使用

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

例如:

String = "the 14 dogs ate 12 bones"
他14岁就回来了

String = "djakld;asjl14ajdka;sdj"
也将返回14

String = "djakld;asjl14ajdka;sdj"
这就是我目前所拥有的

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

我做错了什么?

您要求的数字是0或更多。您需要请求一个或多个:

"\\d+"

这是我为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>();
    }
public T[]GetMatches(字符串输入,字符串匹配模式),其中T:IConvertible
{
列表匹配值=新列表();
Regex MatchInt=新的Regex(匹配模式);
MatchCollection Matches=MatchInt.Matches(输入);
foreach(匹配中的匹配m)
MatchedValues.Add((T)Convert.ChangeType(m.Value,typeof(T));
返回MatchedValues.ToArray();
}
然后,如果您只想获取数字并以字符串[]数组返回它们:

string Test = "22$data44abc";
string[] Matches = this.GetMatches<string>(Test, "\\d+");
string Test=“22$data44abc”;
字符串[]Matches=this.GetMatches(测试“\\d+”);

希望这对某些人有用…

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

所有正则表达式都以非转义格式提供,用于读取,并以转义格式提供,可以在Java中用作字符串文字

从字符串中获取字节、短、int或长:

unescaped: ([\+-]?\d+)([eE][\+-]?\d+)?
  escaped: ([\\+-]?\\d+)([eE][\\+-]?\\d+)?
unescaped: ([\+-]?\d(\.\d*)?|\.\d+)([eE][\+-]?(\d(\.\d*)?|\.\d+))?
  escaped: ([\\+-]?\\d(\\.\\d*)?|\\.\d+)([eE][\\+-]?(\\d(\\.\\d*)?|\\.\\d+))?
…以及奖励积分

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

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

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

另外,对于
someNumber-3
,其中
someNumber
是一个变量名或类似的东西,您可以使用

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

当然,如果你在解析一个像
这样的字符串的话,这是行不通的,对blahblah的净更改是+4

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]*");
使用其中一个:

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


这仍然捕获像099这样的数字,java parseInt将在上面抛出NumberFormatException。我一定是误解了你们
099
通过
Integer.parseInt()
转换为99,请参阅:当数字位于类似“2-1”的字符串中时,此操作是否仍然有效?它将正确地找到第一个匹配项“2”,但第二个匹配项“-1”不正确,因为有一个运算符。你需要使用一些更奇特的东西(包括一个不包含a+的lookbehind,或者-如果前面的东西也是一个数字),我在那些正则表达式中没有看到任何lookbehind。我看到的是Java不支持的结果,如果您希望找到相同的结果,但前面都是负数+字符和正数+字符,该怎么办?即+3或-5或8。。。