2013-05-06 2 views
0

Я пытаюсь создать шестнадцатеричный калькулятор, но у меня есть проблема с regex.Regex базовых классов

В принципе, я хочу, чтобы строка принимать только 0-9, A-E и специальные символы +-*_

Мой код не продолжает возвращаться ложным независимо от того, как изменить регулярное выражение, и добавление звездочка дает мне ошибку PatternSyntaxException.

public static void main(String[] args) { 

    String input = "1A_16+2B_16-3C_16*4D_16"; 

    String regex = "[0-9A-E+-_]"; 

    System.out.println(input.matches(regex)); 

} 

Кроме того, когда я добавить * как часть регулярного выражения дает мне эту ошибку:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal character range near index 9 
[0-9A-E+-*_]+ 
     ^
+1

Вы уверены, что у вашего фактического кода нет 'regex.matches (input)'? http://ideone.com/YtmyTY –

+0

'F' также является шестнадцатеричным символом. Тем не менее, вам действительно нужно использовать лексер и парсер. См. 'Lex' и' yacc' в традиционной UNIX или GNU 'flex' и' bison' в Linux и портах. Вы не хотите '/' вместо '_'? –

ответ

3

Вы должны соответствовать более одного символа с регулярным выражением. Поскольку в настоящее время вы стоите только один персонаж.

Чтобы соответствовать один или несколько символов добавить + до конца регулярного выражения

[0-9A-E+-_]+ 

Кроме того, чтобы соответствовать * просто добавить звезду в скобках, так что окончательное регулярное выражение будет

[0-9A-E+\\-_*]+ 

Вам нужно избегать -, иначе регулярное выражение думает, что вы хотите принять всех символов между + и _, что не то, что вы хотите.

+0

Спасибо! Это исправляет его по большей части. Но я все еще получаю ошибку PatternSyntaxException при добавлении * в качестве части регулярного выражения. Что здесь происходит? –

+0

Я не получаю это исключение, когда я его запускаю. Можете ли вы создать небольшой пример, который показывает это? – FDinoff

+0

@MarcoLau Вам может понадобиться избежать '*' в скобках: '\\ *' – Vulcan

1

Вы регулярное выражение OK не должно быть никаких исключений, просто добавьте + в конце регулярного выражения, которое означает, что один или несколько символов, таких как те, в скобках, и кажется, что вы хотели * а

"[0-9A-E+-_]+" 
0
public static boolean isValidCode (String code) { 
    Pattern p = Pattern.compile("[fFtTvV\\-~^<>()]+"); //a-zA-Z 
    Matcher m = p.matcher(code); 
    return m.matches(); 
} 
Смежные вопросы