2010-01-19 4 views
0

Я строю небольшую библиотеку Java, которая должна соответствовать единицам в строках. Например, если у меня есть «300000000 м/с^2», я хочу, чтобы он соответствовал «m» и «s^2».Как создать регулярное выражение для единиц измерения?

До сих пор, я попытался наиболее мыслимые (мной) конфигурации напоминающая (я надеюсь, что это хорошее начало)

"[[a-zA-Z]+[\\^[\\-]?[0-9]+]?]+" 

Чтобы уточнить, мне нужно что-то, что будет соответствовать letters[^[-]numbers] (где [] означает не обязательно части). Это означает: буквы, возможно, сопровождаемые экспонентом, который может быть отрицательным.

Я немного изучил регулярное выражение, но я действительно не бегло, поэтому любая помощь будет принята с благодарностью!

Большое спасибо,

EDIT: Я только попробовал первые 3 ответов

String regex1 = "([a-zA-Z]+)(?:\\^(-?\\d+))?"; 
String regex2 = "[a-zA-Z]+(\\^-?[0-9]+)?"; 
String regex3 = "[a-zA-Z]+(?:\\^-?[0-9]+)?"; 

и это не работает ... Я знаю, что код, который проверяет образцы работайте, потому что, если я попробую что-то простое, например, сопоставление «[0-9] +» в «12345», оно будет соответствовать всей строке. Итак, я не понимаю, что еще не так. Я пытаюсь с изменением моих скобок скобки, где это необходимо в данный момент ...

КОДА используется для тестирования:

public static void main(String[] args) { 
    String input = "30000 m/s^2"; 

// String input = "35345"; 

    String regex1 = "([a-zA-Z]+)(?:\\^(-?\\d+))?"; 
    String regex2 = "[a-zA-Z]+(\\^-?[0-9]+)?"; 
    String regex3 = "[a-zA-Z]+(?:\\^-?[0-9]+)?"; 
    String regex10 = "[0-9]+"; 
    String regex = "([a-zA-Z]+)(?:\\^\\-?[0-9]+)?"; 
    Pattern pattern = Pattern.compile(regex3); 
    Matcher matcher = pattern.matcher(input); 

    if (matcher.matches()) { 
     System.out.println("MATCHES"); 
     do { 
      int start = matcher.start(); 
      int end = matcher.end(); 
//   System.out.println(start + " " + end); 
      System.out.println(input.substring(start, end)); 
     } while (matcher.find()); 
    } 

} 
+0

Вы можете разместить код, который вы используете для поиска совпадений? –

+0

Несомненно, всего за секунду ... – Joanis

+0

Проблема в том, что вы не включаете/как допустимый символ. Вы могли бы вместо этого записать его как ms^-2, и в целом вы можете иметь несколько единиц, а не только два. –

ответ

1

Вы смешиваете использование квадратных скобок для обозначения классов символов и фигурных скобок для группировки. Попробуйте это вместо:

[a-zA-Z]+(\^-?[0-9]+)? 

Во многих диалектах регулярного выражения вы можете использовать \ d для обозначения любой цифры вместо [0-9].

+0

Большое спасибо за вашу помощь и терпение! – Joanis

2
([a-zA-Z]+)(?:\^(-?\d+))? 

Вам не нужно использовать класс символов [ ... ], если вы соответствуете одному символу. ( ... ) вот скобка для захвата, чтобы вы могли извлечь устройство и показатель позже. (?: ... ) не захватывает группировку.

0

Попробуйте

"[a-zA-Z]+(?:\\^-?[0-9]+)?" 
+0

Вы пропустили '-'. –

+0

Спасибо, я добавил, на самом деле это было намеренно, потому что я не вижу - в строке, чтобы соответствовать – YOU