2008-12-16 31 views
19

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

我在做什麼錯?

回答

48

您要求輸入0位或更多位數。你需要問一個或多個:

"\\d+" 
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

看起來其他解決方案未能處理+/-2e3等案例,因此java.lang.Integer.parseInt(String)支持,所以我會帶走我的問題。我在正則表達式方面有些缺乏經驗,所以我可能犯了一些錯誤,使用了Java的正則表達式解析器不支持的東西,或者使它過於複雜,但這些陳述似乎在Kiki 0.5.6中有效。

所有正則表達式都以非轉義格式提供,用於閱讀,並且可以使用轉義格式作爲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+))? 
+0

這仍然捕獲數字099,其中java parseInt將拋出NumberFormatException。 – 2011-05-07 06:16:18

+0

我一定是誤解你。 `099`被`Integer.parseInt()`轉換爲99,參見:http://pastie.org/1881188 – bgw 2011-05-09 13:42:42

0

除了什麼PiPeep說,如果你試圖匹配在表達式中的整數,這樣1 + 2 - 3將只匹配123,而不是1+ 2- 3,您真正需要使用一個回顧後聲明,以及你想要的部分實際上將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

0

java spec實際上給了這個解析雙打的正則表達式的怪物。然而,它被認爲是不好的做法,只是試圖解析預期的類型,並捕捉錯誤,往往會略微更具可讀性。

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]*"); 
相關問題