Java 正则表达式来查找字符串中的整数
我想将正则表达式与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
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。。。