2016-11-30 5 views
1

Мне нужно разобрать эту строку "/<productId>/save", и я должен гарантировать, что productId является целым числом без знака 32 бит.Создание регулярного выражения для пути URI

Конечно, я мог бы разделить строку с помощью символа «/», а затем в возвращаемом массиве попытаться передать идентификатор продукта в целое число и посмотреть, получилось ли я исключение или нет, но это не кажется очень элегантным решение.

Вместо этого я попытался использовать это регулярное выражение boolean match=path.matches("\\/\\d+\\/save");, который отлично работает, но он не соблюдает ограничение целых 32 бит, в основном я могу ввести число любого размера.

I.e строка followinf /44444444444444444/save"; соответствует регулярному выражению.

Каков более элегантный способ сделать это? Не могли бы вы порекомендовать мне какой-нибудь подход?

+0

Самый элегантный способ явно не пытаться проверить номер с регулярным выражением (это возможно, но уродливо и неэффективно), поэтому извлеките его и проверьте с помощью простого сравнения. Если вы хотите, вы можете ограничить количество цифр в шаблоне. –

+5

Дубликат http://stackoverflow.com/questions/20793578/regex-for-a-valid-32-bit-signed-integer – 0xA2C2A

+0

RegEx не может использоваться для проверки интегральных границ без некоторого _really_ уродливого регулярного выражения. – Qix

ответ

1

Вот одно решение, которое имеет дело с возможностью их количество слишком велико:

@Test 
public void testMatchIntWithRegex() { 
    String rgx = "\\/(\\d+)\\/save"; 
    String example = "/423/save"; 
    String exampleB = "/423666666666666666666666666666666666666666/save"; 

    Pattern p = Pattern.compile(rgx); 
    Matcher m = p.matcher(example); 
    if(m.find()){ 
     String sInt = m.group(1); 
     try{ 
      int num = Integer.parseInt(sInt); 
      System.out.println("num is : " + num); 
     } catch(NumberFormatException e){ 
      e.printStackTrace(); 
     } 


    } 

} 

пример работы в то время как exampleB бросает исключение