2015-08-12 2 views
1

У меня есть такая строка, как показано ниже. Снизу строки Мне нужно извлечь номер 123 и он может быть в любом положении, как показано ниже, но там будет только один номер в строке, и она всегда будет в том же формате _number_Как извлечь номер из строки в определенном формате?

text_data_123 
text_data_123_abc_count 
text_data_123_abc_pqr_count 

text_tery_qwer_data_123 
text_tery_qwer_data_123_count 
text_tery_qwer_data_123_abc_pqr_count 

Ниже приводится код :

String value = "text_data_123_abc_count"; 

// this below code will not work as index 2 is not a number in some of the above example 
int textId = Integer.parseInt(value.split("_")[2]); 

Каков наилучший способ для этого?

+0

Вы должны определить «лучший». Вы можете использовать регулярное выражение или удаление –

ответ

1

С небольшим guava магии:

String value = "text_data_123_abc_count"; 
Integer id = Ints.tryParse(CharMatcher.inRange('0', '9').retainFrom(value) 

см также CharMatcher doc

+0

приятно узнать об этом маленьком трюке от гуавы. – user1950349

1
\\d+ 

это регулярное выражение с find должно сделать это за вас.

+0

@ThaNet: это Java, а не C#. –

1

Использовать положительное утверждение lookahead.

Matcher m = Pattern.compile("(?<=_)\\d+(?=_)").matcher(s); 
while(m.find()) 
{ 
System.out.println(m.group()); 
} 
0

и может получить все части из этой строки и сравните с ЗАГЛАВНЫМИ БУКВАМИ, если оно равно то и можно разобрать его к числу и сэкономьте:

public class Main { 

public static void main(String[] args) { 

    String txt = "text_tery_qwer_data_123_abc_pqr_count"; 

    String[] words = txt.split("_"); 

    int num = 0; 

    for (String t : words) { 
     if(t == t.toUpperCase()) 
      num = Integer.parseInt(t); 
    } 

    System.out.println(num); 
} 

}

+0

Это не удастся, если в ALLCAPS есть слово. –

+0

, тогда вы можете редактировать if: if (t == t.toUpperCase() && t == t.toLowerCase()), все это часть воображения ... – Oscarmageddon

1

Вы можете использовать replaceAll, чтобы удалить все не-цифр, чтобы оставить только один номер (так как вы говорите, что будет только один номер во входной строке):

String s = "text_data_123_abc_count".replaceAll("[^0-9]", ""); 

См IDEONE demo

Вместо [^0-9] вы можете использовать \D (что также означает нецифровой):

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

Учитывая текущие требования и ограничения, решение replaceAll представляется наиболее удобным (не нужно использовать Matcher напрямую).