2013-12-18 1 views
0

Как написать буквенно-цифровую проверку диапазона в java, которая проверит, соответствует ли данное буквенно-цифровое значение в пределах диапазона.Алфавитно-цифровой измеритель диапазона - независимо от того, находится ли B3 в B1: B10

Например: вход: B3, диапазон: В1: В10 - истинная
В1, В1: В10 - истинная
В10, В1: В10 - истинная
В1, В3: В10 - ложные

Моя попытка терпит неудачу для более чем 1 цифры цифр, например, в B3: B10, второй префикс должен быть «B», а num должен быть 10, но я получаю B1 и 0. Есть ли что-то неправильное в регулярном выражении?

public class Main { 

public static final String RANGE_PATTERN = "(.+)(\\d)+:(.+)(\\d)+"; 
public static final String INPUT_PATTERN = "(.+)(\\d)+"; 
public static final Pattern P1 = Pattern.compile(RANGE_PATTERN); 
public static final Pattern P2 = Pattern.compile(INPUT_PATTERN); 

public static void main(String[] args) { 
    System.out.println(checkWithInRange("B3:B10", "B7")); 
} 

public static boolean checkWithInRange(String range, String input) { 
    Matcher m1 = P1.matcher(range); 
    Matcher m2 = P2.matcher(input); 
    if (m1.find() && m2.find()) { 
     String prefix1 = m1.group(1); 
     String num1 = m1.group(2); 
     String prefix2 = m1.group(3); 
     String num2 = m1.group(4); 

     String inputPrefix = m2.group(1); 
     String inputNum = m2.group(2); 

     if (prefix1.equalsIgnoreCase(prefix2) && prefix2.equalsIgnoreCase(inputPrefix)) { 
      int n1 = Integer.parseInt(num1); 
      int n2 = Integer.parseInt(num2); 
      int n3 = Integer.parseInt(inputNum); 
      if (n3 >= n1 && n3 <= n2) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
} 
+0

В чем проблема с этим кодом? Что должно произойти для «A1: B2», «B1»?? –

ответ

1

Использовать "(.+?)... для получения кратчайшей последовательности (без цифр). Или еще лучше "(\\D+)....

Используйте (\\d+) вместо (\\d)+, так что m.group(i) - это целая строка цифр.

Не нужно использовать нулевую проверку групп, возможно, вы указали необязательный префикс: (\\D*).

Вы намеревались find() или должны соответствовать всей строке: matches()?

+0

Мне нужны матчи(), поскольку я хочу совместить всю строку. Как будет \\ D + получить альфа-префикс, который мне нужен? – Praveen

+0

'\\ D' является регулярным выражением для нецифровой цифры, так как цифра' \\ d'. См. [Шаблон] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html). –

0

Благодаря Joop Eggen

Я изменил свое регулярное выражение, как показано ниже,

public static final String RANGE_PATTERN = "(\\D+)(\\d+):(\\D+)(\\d+)"; 
public static final String INPUT_PATTERN = "(\\D+)(\\d+)"; 

Теперь он работает с кодом выше.

Смежные вопросы