注释使用带有java的正则表达式的检测器

时间:2014-09-24 06:53:06

标签: java 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 个答案:

答案 0 :(得分: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");
    }
  }

这只是一个简单的想法,如果某人有更聪明的东西,比如删除空行,请编辑它。

答案 1 :(得分: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());
}

答案 2 :(得分:0)

如果我想找到所有方法?

示例:

class example
{
    public void ex1()


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

结果程序:

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

也使用正则表达式。

答案 3 :(得分: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");
      }
    }
  }

它的格式不像你的想法,但我认为它符合你的要求。

你不应该把新问题作为答案发布,开一个新问题。请将正确答案标记为正确。