2016-10-22 7 views
-2
public class T_token implements Lexer{ 
     static Pattern p = Pattern.compile("\\(| \\) | a"); 
     static Matcher d = p.matcher("(a)"); 

     public static void main(String[] args) { 
      while (d.find()) { 
      System.out.println(d.group()); 
      } 
     } 

Когда я компиляции и запуска этого, выход:Pattern Сличитель не принимает скобках

run: 

a 

BUILD SUCCESSFUL (total time: 0 seconds) 

Так вход я дал согласовани (переменная г) была строка «(а)», но это только распечатывает a, а не скобки в левом и правом скобках .. может кто-то сказать мне, как я могу это исправить?

+2

Прочитайте Javadoc для 'Pattern' тщательно. Буквенные круглые скобки должны быть экранированы, так как небезопасные круглые скобки являются метасимволами, используемыми для группировки. Я рекомендую вам остановиться и потратить некоторое время на изучение синтаксиса регулярных выражений и грамматики. В Интернете много ресурсов, а также Javadoc. –

+0

Какая проблема? Что вы хотите добиться? – Tunaki

+0

вход я положил (а), и поэтому я хочу, чтобы он печатал (а), но он игнорирует скобки, я редактировал свой код, чтобы иметь \\ (и \\), но он все еще не работает. – digeridoo

ответ

0

Есть 2 проблемы в вашем регулярном выражении:

  1. Вы добавили экстракт пространства таким образом, что он будет ожидать место в шаблоне, чтобы найти, не кажется, что вы ожидаете.
  2. Вы не избежали круглых скобок, которые являются специальными символами, используемыми для группировки. Чтобы избежать их, вам нужно использовать двойную обратную косую черту.

Ваше регулярное выражение должно быть \\(|\\)|a.

Выход:

(
a 
) 
+0

Спасибо. , Я знал о \\ (и \\), прежде чем задал вопрос, но добавил вопрос, чтобы выяснить, есть ли какая-либо другая проблема, но актуальной проблемой было обратное пространство, как вы упомянули, и оно получилось правильно – digeridoo