Детектор комментариев, использующий регулярное выражение с Java

1

Я хочу создать детектор начального комментария, используя regex с Java

Я использую область JTextArea для вставки программы исходного кода и комментария JTextArea качестве комментария к печати

Pattern aaa = Pattern.compile("(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)");
Matcher bbb  =aaa.matcher(area.getText());

if(bbb.find())
{   
    comment.setText(bbb.group());
}
else
    System.out.println ("no found");

Мой вводный текст:

start_code();
/****
* Common multi-line comment style.
****/
more_code(); 
/*
* Another common multi-line comment style.
*/
end_code();

но результат программы

/****
* Common multi-line comment style.
****/

Я хочу, чтобы в этой программе были напечатаны все комментарии.

это мой полный код

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.FlowLayout;
import javax.swing.JOptionPane;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

class regex extends JFrame implements ActionListener
{
    JTextArea area;
    JTextArea comment1;
    JButton button1;

    public regex()
    {   
        super("program");
        tombol=new JButton("button1");
        area=new JTextArea();
        comment1=new JTextArea();
        button1.addActionListener(this);
        setLocation(200,200);
        setSize(1100,500);
        setLayout(null);
        area.setBounds(10,10,450,400);
        comment1.setBounds(480,10,450,400);
        button1.setBounds(10,410,450,25);
        add(area);
        add(comment1);
        add(button1);
        show();
    }

    public void actionPerformed(ActionEvent e)
    {
        if(button1==e.getSource())
        {
            Pattern aaa=Pattern.compile("(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)");
            Matcher bbb=aaa.matcher(area.getText());
            if(bbb.find())
            {   
                comment1.setText(bbb.group());
            }
            else
                System.out.println ("no found");
        }
    }

    public static void main(String[] args)
    {
        new regex();
    }
}
Теги:

4 ответа

1

Вы должны изменить эту часть:

if (bbb.find()) {
   comment1.setText(bbb.group());
}

к чему-то вроде этого:

while(bbb.find()) {
   comment1.setText(comment1.getText()+bbb.group()+"\n");
}

потому что bbb.find() возвращает вам следующий ответ.

Также вы можете сократить свою строку регулярных выражений до этого: "(?:/\ * (?: [^] | (?:\+ [^/]))\* +/) | (?://.*)"

Если у вас есть еще вопросы, просто спросите :)

Здесь весь код, это работает для меня:

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JButton;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

@SuppressWarnings("serial")
class RegexTest extends JFrame implements ActionListener {
  JTextArea area;
  JTextArea comment1;
  JButton button1 = new JButton();
  private JButton tombol;

  public RegexTest() {
    super("program");
    tombol = new JButton("button1");
    area = new JTextArea();
    comment1 = new JTextArea();
    button1.addActionListener(this);
    setLocation(200, 200);
    setSize(1100, 500);
    setLayout(null);
    area.setBounds(10, 10, 450, 400);
    comment1.setBounds(480, 10, 450, 400);
    button1.setBounds(10, 410, 450, 25);
    add(area);
    add(comment1);
    add(button1);
    show();
  }

  public void actionPerformed(ActionEvent e) {
    if (button1 == e.getSource()) {
      Pattern aaa = Pattern.compile("(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)");
      Matcher bbb = aaa.matcher(area.getText());
      while (bbb.find()) {
        comment1.setText(comment1.getText() + bbb.group() + "\n");
      }
      // if (bbb.find()) {
      // comment1.setText(bbb.group());
      // } else
      // System.out.println("no found");
    }
  }

  public static void main(String[] args) {
    new RegexTest();
  }
}

Если вы хотите удалить все комментарии:

 public void actionPerformed(ActionEvent e) {
    if (button1 == e.getSource()) {
      Pattern aaa = Pattern.compile("(/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/)|(//.*)");
      Matcher bbb = aaa.matcher(area.getText());
      comment1.setText(bbb.replaceAll("")); //This is the new line

      // while (bbb.find()) {
      // comment1.setText(comment1.getText() + bbb.group() + "\n");
      // }
      // if (bbb.find()) {
      // comment1.setText(bbb.group());
      // } else
      // System.out.println("no found");
    }
  }

Это просто быстрая идея, если у кого-то есть что-то умнее, например, удаление пустых строк, пожалуйста, отредактируйте его.

  • 0
    Вы правы насчет петли. Однако есть еще одна проблема с регулярным выражением. Что если маркер открытия комментария /* будет внутри строки Java? Например: String s = "/* test"; String s1 = "*/";
  • 0
    Хм, вы правы, но это означало бы, что мы должны реализовать что-то, чтобы сделать Strings регулярным-безопасным или использовать что-то описанное здесь
0

Чтобы ответить на ваш второй вопрос. Вы можете попробовать что-то подобное, просто поместите его в свой класс:

 public void actionPerformed(ActionEvent e) {
    if (button1 == e.getSource()) {
      Pattern aaa = Pattern.compile("(public|protected|private|static|\\s) +[\\w\\<\\>\\[\\]]+\\s+(\\w+) *\\([^\\)]*\\) *(\\{?|[^;])");
      Matcher bbb = aaa.matcher(area.getText());
      while (bbb.find()) {
        comment1.setText(comment1.getText() + bbb.group() + "\n");
      }
    }
  }

Он не форматируется, как ваша идея, но я думаю, что он делает то, что вы хотите.

И вы не должны публиковать новые вопросы в качестве ответов, открывать новый. И, пожалуйста, отметьте правильный ответ как правильный.

0

как, если я хочу найти все методы?

пример:

class example
{
    public void ex1()


    {
        statement;
    }
    private string ex2(int a)
    {
        return 0;
    }
    example(){
        statement;
    }
}

программа результата:

ex1() : void
ex2(a : int) : string
example()

с использованием regex тоже.

0

Вы можете перебирать все сопоставимые группы:

if (bbb.find()) {
    StringBuilder comments = new StringBuilder();
    for (int g = 0; g < bbb.groupCount(); g++) {
        comments.append(bbb.group(g));
    }
    comment.setText(comments.toString());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню