2010-03-02 193 views
84

我有一個字符串變量(基本上是一個數字未指定的英文句子),我想提取所有數字到一個整數數組。我想知道是否有正則表達式的快速解決方案?如何從字符串中提取數字並獲取整數的數組?


我用肖恩的解決方案,並改變它稍微:

LinkedList<String> numbers = new LinkedList<String>(); 

Pattern p = Pattern.compile("\\d+"); 
Matcher m = p.matcher(line); 
while (m.find()) { 
    numbers.add(m.group()); 
} 
+1

是數字用空格或其他字符包圍?數字如何格式化,是十六進制,八進制,二進制還是十進制? – 2010-03-02 22:38:43

+0

我想這個問題很明顯:這是一個帶數字的英語句子。此外,我正在談論一個整數數組,所以我在尋找的是整數。 – 2010-03-02 22:56:57

回答

141
Pattern p = Pattern.compile("-?\\d+"); 
Matcher m = p.matcher("There are more than -2 and less than 12 numbers here"); 
while (m.find()) { 
    System.out.println(m.group()); 
} 

...打印-212


- ?匹配領先的負號 - 可選。 \ d匹配一個數字,然而我們需要在的Java String中編寫\。所以,\ d +匹配1個或多個數字。

+4

你能否通過解釋你的正則表達來補充你的答案? – OscarRyz 2010-03-02 22:42:30

+3

- ?匹配領先的負號 - 可選。 \ d匹配一個數字,但我們需要在Java字符串中將\寫爲\\。因此,\\ d +再匹配另外一個數字 – 2010-03-02 23:41:19

+6

我將表達式更改爲Pattern.compile(「 - ?[\\ d \\。] +」)以支持浮點數。你一定會帶我走的,Thx! – jlengrand 2012-06-13 08:31:35

3

爲有理數使用這一個:(([0-9]+.[0-9]*)|([0-9]*.[0-9]+)|([0-9]+))

+1

OP表示整數,而不是實數。此外,您忘了避開這些點,而且這些括號中的任何一個都不是必需的。 – 2010-03-02 23:01:57

17
Pattern p = Pattern.compile("[0-9]+"); 
Matcher m = p.matcher(myString); 
while (m.find()) { 
    int n = Integer.parseInt(m.group()); 
    // append n to list 
} 
// convert list to array, etc 

您實際上可以用\ d替換[0-9],但是這涉及雙反斜槓轉義,這使得難以閱讀。

+0

哎呦。肖恩處理負數,所以這是一個改進。 – sidereal 2010-03-02 22:41:23

+2

如果您使用「 - ?[0-9] +」 – cegprakash 2013-10-22 11:42:20

7
StringBuffer sBuffer = new StringBuffer(); 
    Pattern p = Pattern.compile("[0-9]+.[0-9]*|[0-9]*.[0-9]+|[0-9]+"); 
    Matcher m = p.matcher(str); 
    while (m.find()) { 
    sBuffer.append(m.group()); 
    } 
    return sBuffer.toString(); 

這是用於提取數字保留小數點

0

我建議檢查ASCII值從字符串中提取數字 假設你有一個輸入字符串作爲myname12345,如果你只想提取號碼12345可以首先將字符串轉換爲字符數組這樣做,然後使用以下僞碼

for(int i=0;i<CharacterArray.length;i++) 
    { 
    if(a[i]>=48&&a[i]<=58) 
      System.out.print(a[i]); 
    } 

一旦被提取的數字它們添加到一個數組

希望這有助於

+0

,則您也將處理負數。Java字符串是Unicode/UTF-16代碼單位的統計序列。通過UTF-16的設計,前128個字符與ASCII編碼具有相同的值(不同大小);除此之外,認爲你正在處理ASCII將導致錯誤。 – 2014-05-26 21:24:07

+0

@TomBlodget感謝您的寶貴意見 – 2014-05-27 15:15:08

35

什麼用replaceAll java.lang.String中的方法:

String str = "qwerty-1qwerty-2 455 f0gfg 4";  
    str = str.replaceAll("[^-?0-9]+", " "); 
    System.out.println(Arrays.asList(str.trim().split(" "))); 

輸出:

[-1, -2, 455, 0, 4] 

說明

[^-?0-9]+ 
  • +之間一個和無限次,多次,儘可能需要
  • -?一個字符「的回饋 - ?」
  • 0-9之間的範圍內的字符‘0’和‘9’
+3

爲什麼要保留問號?此外,它將'-'本身視爲一個數字,以及諸如'9-','--- 6'和'1-2-3'之類的東西。 – 2016-05-18 00:09:56

+0

一個非常好的替代方案,不使用導入庫;) – 2017-02-02 19:00:05

2

接受的答案檢測數字,但沒有檢測到格式化的數字,例如2,000,也不是小數,例如4.8。對於這樣的用途-?\\d+(,\\d+)*?\\.?\\d+?

 Pattern p = Pattern.compile("-?\\d+(,\\d+)*?\\.?\\d+?"); 
     List<String> numbers = new ArrayList<String>(); 
     Matcher m = p.matcher("Government has distributed 4.8 million textbooks to 2,000 schools"); 
     while (m.find()) { 
      numbers.add(m.group()); 
     } 
     System.out.println(numbers); 

輸出: [4.8, 2,000]

+0

@JulienS .:我不同意。這個正則表達式比OP所要求的要多得多,而且不正確。 (至少,小數部分應該在可選組中,其中的所有內容都是必需的,並且貪婪:'(?:\。\ d +)?「。) – 2016-05-18 00:45:41

+0

對於小數部分,您肯定有一點。然而,遇到格式化的數字是很常見的。 – Julien 2016-05-20 06:58:35

+0

@AlanMoore許多SO的訪問者正在尋找任何/不同的方式來解決具有不同相似性/差異性的問題,並且提出建議很有幫助。即使是OP也可能過於簡單。 – 2016-07-15 00:43:52

0

使用Java 8,你可以這樣做:

String str = "There 0 are 1 some -2-34 -numbers 567 here 890 ."; 
int[] ints = Arrays.stream(str.replaceAll("-", " -").split("[^-\\d]+")) 
       .filter(s -> !s.matches("-?")) 
       .mapToInt(Integer::parseInt).toArray(); 
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890] 

如果沒有負數,你可以擺脫replaceAll(並使用!s.isEmpty()filter),因爲這只是爲了正確分割像2-34(這也可以純粹與正則表達式處理,但它相當複雜)。

Arrays.stream將我們的String[]變成Stream<String>

filter擺脫了前導和尾隨的空字符串以及不屬於數字的任何-

mapToInt(Integer::parseInt).toArray()請撥打parseIntString上給我們一個int[]


另外,爪哇9的Matcher.results方法,它應該允許這樣的事情:

Pattern p = Pattern.compile("-?\\d+"); 
Matcher m = p.matcher("There 0 are 1 some -2-34 -numbers 567 here 890 ."); 
int[] ints = m.results().map(MatchResults::group).mapToInt(Integer::parseInt).toArray(); 
System.out.println(Arrays.toString(ints)); // prints [0, 1, -2, -34, 567, 890] 

目前的情況是,這些都不是在剛上循環的結果有較大改善與其他答案中顯示的Pattern/Matcher一樣,但如果您想跟隨更復雜的操作,並且使用流顯着簡化,它應該更簡單。

0

我發現這個表達簡單的

String[] extractednums = msg.split("\\\\D++");