我想在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);
我做错了什么?
答案 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
只会匹配1
,2
和3
,而不是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+");