Добавление JMenuItems в JMenu из результатов ReGex через текстовый файл в определенном порядке

В моем JMenuBar я пытаюсь добавить другое JMenu с именем "Party", и в этом меню есть больше меню, которым назначены элементы. У меня проблема либо в том, что мой ReGex не захватывает все нужные значения, и я не уверен, как бы я добавил их в правильном порядке.

Текстовый файл, который я использую для тестирования, выглядит следующим образом (с номерами строк):

  1. ПК- Брэндон
  2. C- Дэйв
  3. C- Боб
  4. PC-CJ
  5. C- Джон
  6. C- Джим
  7. ПК- Надежда
  8. C- Элейн
  9. C- Ким
  10. C- Джо
  11. ПК-Райан
  12. С-Тед

У меня правильно загружается файл, но ReGex, похоже, не захватывает все то, что должен. Предполагаемый JMenu будет выглядеть так:

  • Brandon
    • Дейв
    • боб
  • CJ
    • Джон
    • Джим
  • надежда
    • Элейн
    • Ким
    • Джо
  • Райан
    • Тед

Что-нибудь, начинающееся с "PC- ", являющегося JMenu в JMenu Party, и что-либо, начинающееся с "C- ", являющегося JMenuItem под соответствующим JMenu. Вот мой текущий код для этого раздела.

void loadParty(File f, Frame frame, JMenuBar mb, JMenu me) throws FileNotFoundException {
   Scanner scan = new Scanner(new FileReader(f));
   List<String> text = new ArrayList<String>();
   JMenuItem item;
   me.setText("Party");
   JMenu subMen = new JMenu();

   while(scan.hasNextLine()) {
       text.add(scan.nextLine());
   }
   ArrayList<String> matchesCC = new ArrayList<String>();
   ArrayList<String> charLinks = new ArrayList<String>();
   String regexCC ="^(C- )+(\\w+)+( : )+(http:(.*))";
   Pattern cc = Pattern.compile(regexCC, Pattern.MULTILINE);
   for (String s:text) {
       Matcher m = cc.matcher(s);
       if (m.matches()) {
           charLinks.add(m.group(4));
       }
   }

   String regexTest = "^((\\w+\\W+)(\\w+))";
   ArrayList<String> matchTest = new ArrayList<String>();
   ArrayList<String> cT = new ArrayList<String>();
   Pattern dmTest = Pattern.compile(regexTest, Pattern.MULTILINE);
   for (String s:text) {
       Matcher m = dmTest.matcher(s);
       if (m.matches()) {
           for (int i = 0; i <= m.groupCount(); i++) {
                 System.out.println(m.group(i));
            }
           matchTest.add(m.group(2));
           cT.add(m.group(3));
       }
   }
   for(int i = 0; i < cT.size(); i++) {
       System.out.println(cT.get(i));
   }

   for(int i = 0; i < matchTest.size(); i++) {
      if(matchTest.get(i) == "PC- ") {
          subMen = new JMenu(cT.get(i));
          if(matchTest.get(i) == "C- ") {
              item = new JMenuItem(cT.get(i));
              item.setMnemonic(KeyEvent.VK_0);
              item.addActionListener(new ActionListener() {
                  public void actionPerformed(ActionEvent e) {
                      for(int l = 0; l <charLinks.size(); l++) {
                          if(e.getActionCommand() == matchesCC.get(l)) {
                              URL = charLinks.get(l);
                              loadLink(URL);
                          }
                      }
                  }
              });
              subMen.add(item);
          }
      } 
          me.add(subMen);
   }
   frame.revalidate();
   frame.repaint();
 }

По какой-то причине мой ReGex из "^((\w+\W+)(\w+))" только захватывает: (ПК-Брэндон ПК-Брэндон, ПК-, Брэндон, ПК- CJ, ПК- CJ, ПК-, CJ, ПК- Надежда, ПК- Надежда, ПК-, Надежда) И ничего с "C- "

Буду признателен за любую помощь, и если вам нужна дополнительная информация, пожалуйста, просто спросите!

1 ответ

Во-первых, простите мою педантичность, но "регулярное выражение" - это сокращение от "регулярное выражение". Заглавная буква "ReGex" не имеет смысла, потому что нет слова, начинающегося с G. "RegEx" будет приемлемым, хотя на практике не применяется заглавная буква; это просто "регулярное выражение" или "регулярное выражение".

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

JMenu subMen = null;
while (scan.hasNextLine()) {
    String itemType = scan.next();
    String label = scan.next();

    if (itemType.equals("PC-")) {
        subMen = new JMenu(label);
        me.add(subMen);
    } else {
        final String url = scan.findInLine("http\\S+");

        JMenuItem item = new JMenuItem(label);
        item.addActionListener(e -> loadLink(url));
        subMen.add(item);
    }

    scan.nextLine();
}

Приведенный выше код предполагает, что каждая строка "C-" может соответствовать первому регулярному выражению вашего кода. Как указывает @camickr, текстовые строки, которые вы указали в своем вопросе, вообще не содержат "http", поэтому совпадение никогда не будет успешным. Имейте в виду, что показ данных, которые не являются данными, с которыми вы действительно имеете дело, значительно затрудняет ответ на ваш вопрос.

Вам не нужно вызывать frame.revalidate() или frame.repaint(). Оба из них обрабатываются автоматически при добавлении компонентов в контейнер, если вы не используете пользовательский контейнер и / или пользовательский макет.

Другие вопросы по тегам