2013-02-20 3 views
42

У меня есть строка, и я хочу извлечь (только) последовательность цифр в строке.Извлечь цифры из строки - StringUtils Java

Пример: helloThisIsA1234Пример. Я хочу, чтобы 1234

Указывается, что последовательность цифр будет происходить только один раз внутри строки, но не в том же положении.

(для тех, кто будет спрашивать, у меня есть имя сервера и нужно извлечь определенное число в нем)

Я хотел бы использовать класс StringUtils от Apache commomns.

Спасибо!

+0

Apache [StringUtils] (http://commons.apache.org/lang/api-2.5/org/apac он/Обще/языки/StringUtils.html). Не уверен, почему вы хотите использовать его. – SudoRahul

+0

Это то, что у меня есть, было интересно, может быть, есть функция, которая уже делает что-то вроде меня, но я не так хорошо знаком – NinaNa

+0

Потому что, когда вы можете сделать это с помощью самой 'String', вам не понадобится' StringUtils' из Apache. – SudoRahul

ответ

94

Используйте этот код только только для вас.

String str="sdfvsdf68fsdfsf8999fsdf09"; 
    String numberOnly= str.replaceAll("[^0-9]", ""); 
+3

String.replaceAll() будет скомпилировать этот шаблон каждый раз при его запуске. Действительно неоптимально. Проверьте его источник. Используйте Guarma CharMathcer.DIGIT.retainFrom(), как показано ниже. –

+0

хорошая идея. up для u! – David

+3

не работает для отрицательных чисел :( –

6

Используйте регулярное выражение, например [^0-9], чтобы удалить все разряды.

Оттуда, просто используйте Integer.parseInt(String);

+0

Звучит интересно, можете ли вы дать мне еще код? скажем, моя строка var называется myString, как бы я ее использовал? (Я немного новичок в Java ...) – NinaNa

2

Вы можете использовать следующее регулярное выражение.

string.split(/ /)[0].replace(/[^\d]/g, '') 
1

Попробуйте этот подход, если у вас есть символы, и вы хотите просто цифры:

String s = "@##9823l;Azad9927##$)(^738#"; 
    System.out.println(s=s.replaceAll("[^0-9]", "")); 
    StringTokenizer tok = new StringTokenizer(s,"`[email protected]#$%^&*()-_+=\\.,><?"); 
    String s1 = ""; 
    while(tok.hasMoreTokens()){ 
     s1+= tok.nextToken(); 
    } 
    System.out.println(s1); 
+0

Это медленное решение, потому что String неизменен и в каждом цикле итерации создается новый экземпляр String, замените, по крайней мере, StringBuilder. Тем не менее, он не пишет хорошо – Perlos

5

Вы также можете использовать java.util.Scanner:

new Scanner(str).useDelimiter("[^\\d]+").nextInt()

Вы можете использовать next() вместо nextInt() для получите цифры как строку.

Вы можете проверить наличие номера с помощью hasNextInt() на Scanner.

3

Я создал класс JUnit Test (как дополнительную информацию/информацию) по той же проблеме. Надеюсь, вы найдете это полезным.

public class StringHelper { 
    //Separate words from String which has gigits 
     public String drawDigitsFromString(String strValue){ 
      String str = strValue.trim(); 
      String digits=""; 
      for (int i = 0; i < str.length(); i++) { 
       char chrs = str.charAt(i);    
       if (Character.isDigit(chrs)) 
        digits = digits+chrs; 
      } 
      return digits; 
     } 
    } 

И JUnit Test случай:

public class StringHelperTest { 
    StringHelper helper; 

     @Before 
     public void before(){ 
      helper = new StringHelper(); 
     } 

     @Test 
    public void testDrawDigitsFromString(){ 
     assertEquals("187111", helper.drawDigitsFromString("TCS187TCS111")); 
    } 
} 
15

Я всегда, как с помощью Guava String utils или подобное для такого рода проблем:

String theDigits = CharMatcher.DIGIT.retainFrom("abc12 3def"); // 123 
+1

Это намного быстрее, чем регулярное выражение. Это должен быть принятый ответ. –

4

попробовать это:

String s = "helloThisIsA1234Sample"; 
s = s.replaceAll("\\D+",""); 

Это означает: заменить все возникающие ces цифровых символов (0 -9) пустой строкой!

+1

Было бы неплохо, если бы вы могли добавить небольшое объяснение относительно того, что делает ваш код. :) –

+0

@BhargavRao Это сделано ... вы были правым человеком;) – Shessuky

10

Только одна линия:

int value = Integer.parseInt(string.replaceAll("[^0-9]", "")); 
1
 String line = "This order was32354 placed for QT ! OK?"; 
     String regex = "[^\\d]+"; 

     String[] str = line.split(regex); 

     System.out.println(str[1]); 
1

Вы можете разделить строку и сравнить с каждым символом

public static String extractNumberFromString(String source) { 
    StringBuilder result = new StringBuilder(100); 
    for (char ch : source.toCharArray()) { 
     if (ch >= '0' && ch <= '9') { 
      result.append(ch); 
     } 
    } 

    return result.toString(); 
} 

Тестирование кода

@Test 
    public void test_extractNumberFromString() { 
    String numberString = NumberUtil.extractNumberFromString("+61 415 987 636"); 
    assertThat(numberString, equalTo("61415987636")); 

    numberString = NumberUtil.extractNumberFromString("(02)9295-987-636"); 
    assertThat(numberString, equalTo("029295987636")); 

    numberString = NumberUtil.extractNumberFromString("(02)[email protected]#$%^&*()+_<>?,.:';9295-{}[=]987-636"); 
    assertThat(numberString, equalTo("029295987636")); 
} 
0

Очень простое решение, если они разделены запятой или если не разделены запятой

public static void main(String[] args) { 

    String input = "a,1,b,2,c,3,d,4"; 
    input = input.replaceAll(",", ""); 

    String alpha =""; 
    String num = ""; 

    char[] c_arr = input.toCharArray(); 

    for(char c: c_arr) { 
     if(Character.isDigit(c)) { 
      alpha = alpha + c; 
     } 
     else { 
      num = num+c; 
     } 
    } 

    System.out.println("Alphabet: "+ alpha); 
    System.out.println("num: "+ num); 

} 
0

String s="as234dfd423"; for(int i=0;i<s.length();i++) { char c=s.charAt(i);`` char d=s.charAt(i); if ('a' <= c && c <= 'z') System.out.println("String:-"+c); else if ('0' <= d && d <= '9') System.out.println("number:-"+d); } выход: - номер: -4 номер: -3 номер: -4 Строка: -d строки: -f строки: -d номер: -2 номер: -3

+0

Ваш результат не соответствует вашему тестовому входу. –