Я хочу создать детектор начального комментария, используя 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();
}
}
Вы должны изменить эту часть:
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");
}
}
Это просто быстрая идея, если у кого-то есть что-то умнее, например, удаление пустых строк, пожалуйста, отредактируйте его.
Чтобы ответить на ваш второй вопрос. Вы можете попробовать что-то подобное, просто поместите его в свой класс:
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");
}
}
}
Он не форматируется, как ваша идея, но я думаю, что он делает то, что вы хотите.
И вы не должны публиковать новые вопросы в качестве ответов, открывать новый. И, пожалуйста, отметьте правильный ответ как правильный.
как, если я хочу найти все методы?
пример:
class example
{
public void ex1()
{
statement;
}
private string ex2(int a)
{
return 0;
}
example(){
statement;
}
}
программа результата:
ex1() : void
ex2(a : int) : string
example()
с использованием regex тоже.
Вы можете перебирать все сопоставимые группы:
if (bbb.find()) {
StringBuilder comments = new StringBuilder();
for (int g = 0; g < bbb.groupCount(); g++) {
comments.append(bbb.group(g));
}
comment.setText(comments.toString());
}
/*
будет внутри строки Java? Например:String s = "/* test"; String s1 = "*/";