2015-11-30 2 views
1
.

. Есть ли простой способ проверить, имеет ли строка год в нем (например, 4-значное число), а также найти количество времени, в котором 4-значное число присутствует в строка.Проверьте, есть ли в строке String год.

например "My test string with year 1996 and 2015"

Выхода

Has year - YES number of times - 2 values - 1996 2015

Я думал, что делать раздельную строку и проверить каждое слово, но хотел, чтобы проверить, есть ли эффективный способ.

+1

Использование регулярных выражений? Что-то вдоль строки x '^ | [\ W] (\ d {4}) [\ W] | $"? – Jan

+1

Eh, '" возможный встречный пример: 1000 и 9999 "' - вы хотите '1000' и, esp. '9999' обрабатывается как годы? –

+0

@DmitryBychenko Я обработаю это на стороне клиента, на данный момент только 4-разрядная проверка в порядке. – Jeyaprakash

ответ

6

Вы можете использовать это регулярное выражение:

^[0-9]{4}$ 

Объяснение:

^  : Start anchor 
[0-9] : Character class to match one of the 10 digits 
{4} : Range quantifier. exactly 4. 
$  : End anchor 

А вот пример кода:

String text = "My test string with year 1996 and 2015 and 1999, and 1900-2000"; 
    text = text.replaceAll("[^0-9]", "#"); //simple solution for replacing all non digits. 
    String[] arr = text.split("#"); 

    boolean hasYear = false; 
    int matches = 0; 
    StringBuilder values = new StringBuilder(); 

    for(String s : arr){ 
     if(s.matches("^[0-9]{4}$")){ 
      hasYear = true; 
      matches++; 
      values.append(s+" "); 
     } 
    } 
    System.out.println("hasYear: " + hasYear); 
    System.out.println("number of times: " + matches); 
    System.out.println("values: " + values.toString().trim()); 

Выход:

hasYear: true 
number of times: 5 
values: 1996 2015 1999 1900 2000 
+1

В течение многих лет я бы рекомендовал это регулярное выражение, если вы уверены, что он должен просто работать годами между 1000 и 2999: '^ [1-2] [0-9] {3} $'. Иначе вы можете проверить полученные числа после этого в течение заданного диапазона дат (например, между 1970 и 2100 годами). –

+0

@SebastianBaumhekel Да, вы правильно, но вопросник хотел четыре цифры. Qoute: «Я обработаю это на стороне клиента, на данный момент просто проверка на 4 цифры в порядке» – Patrick

+0

Это не будет найти лет рядом с символами пунктуации (или вкладками), например, это было в 2015 году. «Возможно, вам понадобится использовать' \ b' для проверки границы слова и использовать регулярное выражение на всей строке вместо разделения сначала в местах. – Robert

2

Поскольку уже есть хорошее решение с использованием регулярных выражений я представлю шахту без регулярных выражений:

private static List<String> findNumbers(String searchStr) { 
    List<String> list = new ArrayList<String>(); 
    int numbers = 0, first = -1; 
    for (int i = 0; i < searchStr.length(); i++) { 
     char ch = searchStr.charAt(i); 
     if (ch >= '0' && ch <= '9') { 
      first = first < 0 ? i : first; 
      numbers++; 
     } else { 
      if (numbers == 4) 
       list.add(searchStr.substring(first, i)); 
      numbers = 0; 
      first = -1; 
     } 
    } 
    if (numbers == 4) 
     list.add(searchStr.substring(first, first+4)); 
    return list; 
} 
Смежные вопросы